シリアルポート非同期同期通信
27353 ワード
- /*------+------+------+------+------+------+------+------+------+------+------+------
-
- , ( ),
- RS485 。
- , 。
- ,RS485 , 。
- /*------+------+------+------+------+------+------+------+------+------+------+----*/
-
- /*------+------+------+------+------+------+------+------+------+------+------+------+
- VC++6.0, RS485Comm, IDD_RS485COMM_DIALOG
- ,ID IDC_SEND IDC_RECEIVE, “ ” “ ”;
- IDC_DISP, 。
- ------+------+------+------+------+------+------+------+------+------+------+-------*/
-
- // RS485CommDlg.cpp :
-
- HANDLE hCom; // ,
-
- // RS485CommDlg.cpp OnInitDialog() :
-
- // TODO: Add extra initialization here
- hCom=CreateFile( "COM1", //COM1
- GENERIC_READ|GENERIC_WRITE, //
- 0, //
- NULL,
- OPEN_EXISTING, //
- 0, //
- NULL );
- if(hCom==(HANDLE)-1)
- {
- AfxMessageBox(" COM !");
- return FALSE;
- }
-
- SetupComm(hCom,100,100); // 1024
-
- COMMTIMEOUTS TimeOuts;
-
- //
- TimeOuts.ReadIntervalTimeout=MAXDWORD;
- TimeOuts.ReadTotalTimeoutMultiplier=0;
- TimeOuts.ReadTotalTimeoutConstant=0;
-
- // ,
- // 。
-
- //
- TimeOuts.WriteTotalTimeoutMultiplier=100;
- TimeOuts.WriteTotalTimeoutConstant=500;
-
- SetCommTimeouts(hCom,&TimeOuts); //
-
- DCB dcb;
- GetCommState(hCom,&dcb);
- dcb.BaudRate=9600; // 9600
- dcb.ByteSize=8; // 8
- dcb.Parity=NOPARITY; //
- dcb.StopBits=TWOSTOPBITS; //
- SetCommState(hCom,&dcb);
-
- PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
-
- // IDC_SEND IDC_RECEIVE , :
- void CRS485CommDlg::OnSend()
- {
- /*------+------+------+------+------+------+------+------+-------
- | TODO: Add your control notification handler code here |
- | XMA5000 : |
- | RS485 。 |
- | , 11 ,1 (0),8 ,2 (1) |
- | : , :DC1 AAA BB ETX |
- | :DC1 ASCII , 11H( 17) |
- | XMA5000 ,DC1 |
- | AAA , XMA5000 |
- | BB , 01 |
- | ETX ASCII , 03H |
- | XMA5000 ,ETX |
- ------+------+------+------+------+------+------+------+------+*/
- char lpOutBuffer[7];
- memset(lpOutBuffer,''\0'',7); // 7
- lpOutBuffer[0]=''\x11''; // 1 DC1
- lpOutBuffer[1]=''0''; // 2 0(30H)
- lpOutBuffer[2]=''0''; // 3 0(30H)
- lpOutBuffer[3]=''1''; // 4 1(31H)
- lpOutBuffer[4]=''0''; // 5 0(30H)
- lpOutBuffer[5]=''1''; // 6 1(31H)
- lpOutBuffer[6]=''\x03''; // 7 ETX
-
- // , 001
- DWORD dwBytesWrite=7;
- COMSTAT ComStat;
- DWORD dwErrorFlags;
- BOOL bWriteStat;
- ClearCommError(hCom,&dwErrorFlags,&ComStat);
- bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
- if(!bWriteStat)
- {
- AfxMessageBox(" !");
- }
-
- }
-
- void CRS485CommDlg::OnReceive()
- {
- // TODO: Add your control notification handler code here
- char str[100];
- memset(str,''\0'',100);
- DWORD wCount=100; //
- BOOL bReadStat;
- bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
- if(!bReadStat)
- AfxMessageBox(" !");
- PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
- m_disp=str;
- UpdateData(FALSE);
-
- }
-
- // , , 。
- // ClassWizard, IDC_DISP CString m_disp, WM_CLOSE :
-
- void CRS485CommDlg::OnClose()
- {
- // TODO: Add your message handler code here and/or call default
- CloseHandle(hCom); //
- CDialog::OnClose();
- }
-
-
- //--------------------------------------------------------------------------------------------------
- //--------------------------------------------------------------------------------------------------
-
-
- // 。 , , 。
- // 2
-
- /*------+------+------+------+------+------+------+------+------+------+------+------+------+-------
- VC++6.0, RS485Comm, IDD_RS485COMM_DIALOG ,
- ID IDC_SEND IDC_RECEIVE, “ ” “ ”; IDC_DISP,
- 。 RS485CommDlg.cpp :
- /*------+------+------+------+------+------+------+------+------+------+------+------+------+------*/
-
- HANDLE hCom; // ,
-
- // RS485CommDlg.cpp OnInitDialog() :
-
- hCom=CreateFile( "COM1", //COM1
- GENERIC_READ|GENERIC_WRITE, //
- 0, //
- NULL,
- OPEN_EXISTING, //
- FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //
- NULL );
- if(hCom==(HANDLE)-1)
- {
- AfxMessageBox(" COM !");
- return FALSE;
- }
-
- SetupComm(hCom,100,100); // 100
-
- COMMTIMEOUTS TimeOuts;
- //
- TimeOuts.ReadIntervalTimeout=MAXDWORD;
- TimeOuts.ReadTotalTimeoutMultiplier=0;
- TimeOuts.ReadTotalTimeoutConstant=0;
- // ,
- // 。
-
- //
- TimeOuts.WriteTotalTimeoutMultiplier=100;
- TimeOuts.WriteTotalTimeoutConstant=500;
- SetCommTimeouts(hCom,&TimeOuts); //
-
- DCB dcb;
- GetCommState(hCom,&dcb);
- dcb.BaudRate=9600; // 9600
- dcb.ByteSize=8; // 8
- dcb.Parity=NOPARITY; //
- dcb.StopBits=TWOSTOPBITS; //
- SetCommState(hCom,&dcb);
-
- PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
-
- // IDC_SEND IDC_RECEIVE , :
-
- void CRS485CommDlg::OnSend()
- {
- // TODO: Add your control notification handler code here
- OVERLAPPED m_osWrite;
- memset(&m_osWrite,0,sizeof(OVERLAPPED));
- m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
-
- char lpOutBuffer[7];
- memset(lpOutBuffer,''\0'',7);
- lpOutBuffer[0]=''\x11'';
- lpOutBuffer[1]=''0'';
- lpOutBuffer[2]=''0'';
- lpOutBuffer[3]=''1'';
- lpOutBuffer[4]=''0'';
- lpOutBuffer[5]=''1'';
- lpOutBuffer[6]=''\x03'';
-
- DWORD dwBytesWrite=7;
- COMSTAT ComStat;
- DWORD dwErrorFlags;
- BOOL bWriteStat;
- ClearCommError(hCom,&dwErrorFlags,&ComStat);
- bWriteStat=WriteFile(hCom,lpOutBuffer,
- dwBytesWrite,& dwBytesWrite,&m_osWrite);
-
- if(!bWriteStat)
- {
- if(GetLastError()==ERROR_IO_PENDING)
- {
- WaitForSingleObject(m_osWrite.hEvent,1000);
- }
- }
-
- }
-
- void CRS485CommDlg::OnReceive()
- {
- // TODO: Add your control notification handler code here
- OVERLAPPED m_osRead;
- memset(&m_osRead,0,sizeof(OVERLAPPED));
- m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
-
- COMSTAT ComStat;
- DWORD dwErrorFlags;
-
- char str[100];
- memset(str,''\0'',100);
- DWORD dwBytesRead=100;//
- BOOL bReadStat;
-
- ClearCommError(hCom,&dwErrorFlags,&ComStat);
- dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
- bReadStat=ReadFile(hCom,str,
- dwBytesRead,&dwBytesRead,&m_osRead);
- if(!bReadStat)
- {
- if(GetLastError()==ERROR_IO_PENDING) //GetLastError() ERROR_IO_PENDING,
- {
- WaitForSingleObject(m_osRead.hEvent,2000);
- // WaitForSingleObject , 2
- // ,m_osRead hEvent
- }
- }
-
- PurgeComm(hCom, PURGE_TXABORT|
- PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
- m_disp=str;
- UpdateData(FALSE);
- }
-
- // ClassWizard, IDC_DISP CString m_disp, WM_CLOSE :
-
- void CRS485CommDlg::OnClose()
- {
- // TODO: Add your message handler code here and/or call default
- CloseHandle(hCom); //
- CDialog::OnClose();
- }
-
-
- // , 。