シリアルポート非同期同期通信



  
  
  
  
  1. /*------+------+------+------+------+------+------+------+------+------+------+------  
  2.  
  3.    , ( ),  
  4.      RS485 。  
  5.      , 。  
  6.    ,RS485 , 。  
  7. /*------+------+------+------+------+------+------+------+------+------+------+----*/ 
  8.  
  9. /*------+------+------+------+------+------+------+------+------+------+------+------+  
  10.      VC++6.0, RS485Comm, IDD_RS485COMM_DIALOG  
  11.      ,ID IDC_SEND IDC_RECEIVE, “ ” “ ”;  
  12.      IDC_DISP, 。  
  13. ------+------+------+------+------+------+------+------+------+------+------+-------*/ 
  14.  
  15. // RS485CommDlg.cpp :  
  16.  
  17. HANDLE hCom;  // ,  
  18.  
  19. // RS485CommDlg.cpp OnInitDialog() :  
  20.  
  21. // TODO: Add extra initialization here  
  22. hCom=CreateFile(    "COM1",                     //COM1  
  23.                     GENERIC_READ|GENERIC_WRITE, //  
  24.                     0,                          //  
  25.                     NULL,  
  26.                     OPEN_EXISTING,              //  
  27.                     0,                          //  
  28.                     NULL    );  
  29. if(hCom==(HANDLE)-1)  
  30. {  
  31.     AfxMessageBox(" COM !");  
  32.     return FALSE;  
  33. }  
  34.  
  35. SetupComm(hCom,100,100); // 1024  
  36.  
  37. COMMTIMEOUTS TimeOuts;  
  38.  
  39. //  
  40. TimeOuts.ReadIntervalTimeout=MAXDWORD;  
  41. TimeOuts.ReadTotalTimeoutMultiplier=0;  
  42. TimeOuts.ReadTotalTimeoutConstant=0;  
  43.  
  44. // ,  
  45. // 。  
  46.  
  47. //  
  48. TimeOuts.WriteTotalTimeoutMultiplier=100;  
  49. TimeOuts.WriteTotalTimeoutConstant=500;  
  50.  
  51. SetCommTimeouts(hCom,&TimeOuts);    //  
  52.  
  53. DCB dcb;  
  54. GetCommState(hCom,&dcb);  
  55. dcb.BaudRate=9600;                  // 9600  
  56. dcb.ByteSize=8;                     // 8  
  57. dcb.Parity=NOPARITY;                //  
  58. dcb.StopBits=TWOSTOPBITS;           //  
  59. SetCommState(hCom,&dcb);  
  60.  
  61. PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);  
  62.  
  63. // IDC_SEND IDC_RECEIVE , :  
  64. void CRS485CommDlg::OnSend()   
  65. {  
  66.     /*------+------+------+------+------+------+------+------+-------  
  67.     |   TODO: Add your control notification handler code here       |  
  68.     |    XMA5000 :                   |  
  69.     |    RS485 。                       |  
  70.     |    , 11 ,1 (0),8 ,2 (1)  |  
  71.     |    : , :DC1 AAA BB ETX         |  
  72.     |    :DC1 ASCII , 11H( 17)   |  
  73.     |    XMA5000 ,DC1                         |  
  74.     |   AAA , XMA5000            |  
  75.     |   BB , 01                               |  
  76.     |   ETX ASCII , 03H                 |  
  77.     |    XMA5000 ,ETX                    |  
  78.     ------+------+------+------+------+------+------+------+------+*/ 
  79.     char lpOutBuffer[7];  
  80.     memset(lpOutBuffer,''\0'',7);   // 7  
  81.     lpOutBuffer[0]=''\x11'';        // 1 DC1  
  82.     lpOutBuffer[1]=''0'';           // 2 0(30H)  
  83.     lpOutBuffer[2]=''0'';           // 3 0(30H)  
  84.     lpOutBuffer[3]=''1'';           //  4 1(31H)  
  85.     lpOutBuffer[4]=''0'';           // 5 0(30H)  
  86.     lpOutBuffer[5]=''1'';           // 6 1(31H)  
  87.     lpOutBuffer[6]=''\x03'';        // 7 ETX  
  88.       
  89.     // , 001   
  90.     DWORD dwBytesWrite=7;  
  91.     COMSTAT ComStat;  
  92.     DWORD dwErrorFlags;  
  93.     BOOL bWriteStat;  
  94.     ClearCommError(hCom,&dwErrorFlags,&ComStat);  
  95.     bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);  
  96.     if(!bWriteStat)  
  97.     {  
  98.         AfxMessageBox(" !");  
  99.     }  
  100.  
  101. }  
  102.  
  103. void CRS485CommDlg::OnReceive()   
  104. {  
  105.     // TODO: Add your control notification handler code here  
  106.     char str[100];  
  107.     memset(str,''\0'',100);  
  108.     DWORD wCount=100;       //  
  109.     BOOL bReadStat;  
  110.     bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);  
  111.     if(!bReadStat)  
  112.         AfxMessageBox(" !");  
  113.     PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);  
  114.     m_disp=str;  
  115.     UpdateData(FALSE);  
  116.    
  117. }  
  118.  
  119. // , , 。  
  120. // ClassWizard, IDC_DISP CString m_disp, WM_CLOSE :  
  121.  
  122. void CRS485CommDlg::OnClose()   
  123. {  
  124.  // TODO: Add your message handler code here and/or call default  
  125.     CloseHandle(hCom);  //  
  126.     CDialog::OnClose();  
  127. }  
  128.  
  129.  
  130. //--------------------------------------------------------------------------------------------------  
  131. //--------------------------------------------------------------------------------------------------  
  132.  
  133.  
  134. // 。 , , 。  
  135. // 2  
  136.  
  137. /*------+------+------+------+------+------+------+------+------+------+------+------+------+-------  
  138.      VC++6.0, RS485Comm, IDD_RS485COMM_DIALOG ,  
  139.     ID IDC_SEND IDC_RECEIVE, “ ” “ ”; IDC_DISP,  
  140.      。 RS485CommDlg.cpp :  
  141. /*------+------+------+------+------+------+------+------+------+------+------+------+------+------*/ 
  142.  
  143. HANDLE hCom; // ,  
  144.  
  145. // RS485CommDlg.cpp OnInitDialog() :  
  146.  
  147. hCom=CreateFile(    "COM1",                                     //COM1  
  148.                     GENERIC_READ|GENERIC_WRITE,                 //  
  149.                     0,                                          //  
  150.                     NULL,  
  151.                     OPEN_EXISTING,                              //  
  152.                     FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //  
  153.                     NULL    );  
  154. if(hCom==(HANDLE)-1)  
  155. {  
  156.     AfxMessageBox(" COM !");  
  157.     return FALSE;  
  158. }  
  159.  
  160. SetupComm(hCom,100,100); // 100  
  161.  
  162. COMMTIMEOUTS TimeOuts;  
  163. //  
  164. TimeOuts.ReadIntervalTimeout=MAXDWORD;  
  165. TimeOuts.ReadTotalTimeoutMultiplier=0;  
  166. TimeOuts.ReadTotalTimeoutConstant=0;  
  167. // ,  
  168. // 。  
  169.  
  170. //  
  171. TimeOuts.WriteTotalTimeoutMultiplier=100;  
  172. TimeOuts.WriteTotalTimeoutConstant=500;  
  173. SetCommTimeouts(hCom,&TimeOuts);        //  
  174.  
  175. DCB dcb;  
  176. GetCommState(hCom,&dcb);  
  177. dcb.BaudRate=9600;                      // 9600  
  178. dcb.ByteSize=8;                         // 8  
  179. dcb.Parity=NOPARITY;                    //  
  180. dcb.StopBits=TWOSTOPBITS;               //  
  181. SetCommState(hCom,&dcb);  
  182.  
  183. PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);  
  184.    
  185. // IDC_SEND IDC_RECEIVE , :  
  186.  
  187. void CRS485CommDlg::OnSend()   
  188. {  
  189.     // TODO: Add your control notification handler code here  
  190.     OVERLAPPED m_osWrite;  
  191.     memset(&m_osWrite,0,sizeof(OVERLAPPED));  
  192.     m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);  
  193.  
  194.     char lpOutBuffer[7];  
  195.     memset(lpOutBuffer,''\0'',7);  
  196.     lpOutBuffer[0]=''\x11'';  
  197.     lpOutBuffer[1]=''0'';  
  198.     lpOutBuffer[2]=''0'';  
  199.     lpOutBuffer[3]=''1'';  
  200.     lpOutBuffer[4]=''0'';  
  201.     lpOutBuffer[5]=''1'';  
  202.     lpOutBuffer[6]=''\x03'';  
  203.  
  204.     DWORD dwBytesWrite=7;  
  205.     COMSTAT ComStat;  
  206.     DWORD dwErrorFlags;  
  207.     BOOL bWriteStat;  
  208.     ClearCommError(hCom,&dwErrorFlags,&ComStat);  
  209.     bWriteStat=WriteFile(hCom,lpOutBuffer,  
  210.     dwBytesWrite,& dwBytesWrite,&m_osWrite);  
  211.  
  212.     if(!bWriteStat)  
  213.     {  
  214.         if(GetLastError()==ERROR_IO_PENDING)  
  215.         {  
  216.             WaitForSingleObject(m_osWrite.hEvent,1000);  
  217.         }  
  218.     }  
  219.  
  220. }  
  221.  
  222. void CRS485CommDlg::OnReceive()   
  223. {  
  224.     // TODO: Add your control notification handler code here  
  225.     OVERLAPPED m_osRead;  
  226.     memset(&m_osRead,0,sizeof(OVERLAPPED));  
  227.     m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);  
  228.  
  229.     COMSTAT ComStat;  
  230.     DWORD dwErrorFlags;  
  231.  
  232.     char str[100];  
  233.     memset(str,''\0'',100);  
  234.     DWORD dwBytesRead=100;//  
  235.     BOOL bReadStat;  
  236.  
  237.     ClearCommError(hCom,&dwErrorFlags,&ComStat);  
  238.     dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);  
  239.     bReadStat=ReadFile(hCom,str,  
  240.     dwBytesRead,&dwBytesRead,&m_osRead);  
  241.     if(!bReadStat)  
  242.     {  
  243.         if(GetLastError()==ERROR_IO_PENDING)    //GetLastError() ERROR_IO_PENDING,  
  244.         {  
  245.             WaitForSingleObject(m_osRead.hEvent,2000);  
  246.             // WaitForSingleObject , 2  
  247.             // ,m_osRead hEvent  
  248.         }  
  249. }  
  250.  
  251.     PurgeComm(hCom, PURGE_TXABORT|  
  252.     PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);  
  253.     m_disp=str;  
  254.     UpdateData(FALSE);  
  255. }  
  256.  
  257. // ClassWizard, IDC_DISP CString m_disp, WM_CLOSE :  
  258.  
  259. void CRS485CommDlg::OnClose()   
  260. {  
  261.     // TODO: Add your message handler code here and/or call default  
  262.     CloseHandle(hCom);      //  
  263.     CDialog::OnClose();  
  264. }  
  265.  
  266.  
  267. // , 。