闲话少说,贴出代码来:
- C/C++ code
//串口打开函数BOOL OpenPort(HWND hWnd){ DWORD dwError; //打开串口 hSerPort=CreateFile(TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hSerPort == INVALID_HANDLE_VALUE) { dwError = GetLastError(); MessageBox(hWnd, _T("Open Port (COM1:) Error!"), _T("ERROR"), 0); return FALSE; } //设置串口输入输出缓冲区大小 //SetupComm(hSerPort, _InQue, _OutQue); //设置串口事件掩码 //SetCommMask(hSerPort, 0); //设置串口属性 if(ConfigComm()) { fContinue = TRUE; return TRUE; } else { MessageBox(hWnd, TEXT("Config COM1: error!"), TEXT("ERROR"), 0); CloseHandle(hSerPort); return FALSE; }}//串口设置函数BOOL ConfigComm(){ DCB dcb; COMMTIMEOUTS tmOuts; //获取串口原始属性 GetCommState(hSerPort, &dcb); dcb.BaudRate = 19200; // 设置波特率 dcb.ByteSize = 8; // 数据位,范围:4-8 dcb.Parity = NOPARITY; // 校验模式:无校验 dcb.StopBits = ONESTOPBIT; // 停止位: 1位 dcb.fParity = FALSE; // 不支持奇偶校验 //dcb.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE dcb.fNull = FALSE; // Disable null stripping /*以下这些设置了之后有用么??? dcb.fOutxCtsFlow = FALSE; // No CTS output flow control dcb.fOutxDsrFlow = FALSE; // No DSR output flow control dcb.fDtrControl = DTR_CONTROL_DISABLE; //启用流量控制 // DTR flow control type dcb.fDsrSensitivity = FALSE; // DSR sensitivity dcb.fTXContinueOnXoff = TRUE; // XOFF continues Tx dcb.fOutX = FALSE; // No XON/XOFF out flow control dcb.fInX = FALSE; // No XON/XOFF in flow control dcb.fErrorChar = FALSE; // Disable error replacement dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS flow control dcb.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写 */ if(!SetCommState(hSerPort, &dcb)) { return FALSE; } //设置串口超时时间,[color=#FF0000]这样设置有问题吗?超时的设置是不是跟波特率有关才行?[/color] GetCommTimeouts(hSerPort, &tmOuts); tmOuts.ReadIntervalTimeout = 0; tmOuts.ReadTotalTimeoutConstant = 0; tmOuts.ReadTotalTimeoutMultiplier = 0; tmOuts.WriteTotalTimeoutConstant = 0; tmOuts.WriteTotalTimeoutMultiplier = 0; if(!SetCommTimeouts(hSerPort, &tmOuts)) { return FALSE; } //指定端口监测的事件集 //SetCommMask (hSerPort, EV_RXCHAR); //分配设备缓冲区 //SetupComm(hSerPort, 10, 10); //初始化缓冲区中的信息 PurgeComm(hSerPort, PURGE_TXCLEAR | PURGE_RXCLEAR); return TRUE;}DWORD SendThread (PVOID pArg){ TCHAR szText[TEXTSIZE]; TCHAR szDlg[128]; DWORD dwLen; BOOL stat, start; HWND hWnd = (HWND)pArg; start = TRUE; while(1) { Sleep(5000); if(fContinue) { if(!fContinue)//这句话是浪费的,大家不用管 break; if(start) { lstrcat(szText, TEXT("ATE0\r")); start = FALSE; wsprintf(szDlg, TEXT("Sended ATE0. \r\n")); UpdateHistory((LPARAM)szDlg); } else { lstrcat(szText, TEXT("AT\r")); //显示发送的数据 wsprintf(szDlg, TEXT("Sended AT.\r\n")); UpdateHistory((LPARAM)szDlg); } PurgeComm(hSerPort, PURGE_TXCLEAR | PURGE_RXCLEAR); //发送之前先清空输入输出缓冲区 stat = WriteFile (hSerPort, szText, lstrlen (szText)*sizeof (TCHAR), &dwLen, 0); if(!stat) { wsprintf(szDlg, TEXT("Send ERROR!!\r\n")); UpdateHistory((LPARAM)szDlg); return 0; } } else break; } return 0;}DWORD ReadThread (PVOID pArg){ //BYTE szText[TEXTSIZE]; //COMSTAT comstat; //SetCommMask (hSerPort, EV_RXCHAR); while (fContinue) { /* if(ReadFile(hSerPort, szText, 10, &dwLength, NULL)) { if(dwLength != 0) { TCHAR dlg[128]; wsprintf(dlg, TEXT("received %d bytes.\r\n"), dwLength); UpdateHistory((LPARAM)dlg); UpdateHistory((LPARAM)szText); } }*/ /************************************************* DWORD dwError, dwLength; COMSTAT comstat; ClearCommError(hSerPort, &dwError, &comstat); if(comstat.cbInQue > 0) { ReadFile(hSerPort, &szText, comstat.cbInQue, &dwLength, 0); //保存数据 TCHAR *tmp = new TCHAR[iCount + 1]; if(tmp == NULL) return -1; TCHAR dlg[128]; wsprintf(dlg, TEXT("received %d bytes.\r\n"), comstat.cbInQue); UpdateHistory((LPARAM)dlg); memcpy(tmp, szText, iCount); lstrcat(tmp, TEXT("\r\n")); UpdateHistory((LPARAM)tmp); PurgeComm(hSerPort, PURGE_RXCLEAR); } Sleep(1);*/ //**************************************************/ //DWORD dwCommStatus; //WaitCommEvent(hSerPort, &dwCommStatus, 0); //SetCommMask (hSerPort, EV_RXCHAR); //PurgeComm(hSerPort, PURGE_RXCLEAR); //memset(szText, 0, sizeof(szText)); TCHAR szText[TEXTSIZE]; BYTE rByte; //接收到的一个字节 DWORD dwLength; //实际接收的字节数 INT iCount=0; TCHAR tch; do { ReadFile(hSerPort, &rByte, 1, &dwLength, 0); if(dwLength == 1) { szText[iCount] = rByte; iCount ++; tch = (tch << 8) & 0xff00; if (tch == TEXT ('\n')) break; //if(iCount >= TEXTSIZE) //{ // return -1;//缓冲区满 //} } }while(dwLength == 1); //ClearCommError(hSerPort,&dwReadErrors,&cmState);//清除错误标志并得到串口状态 //PurgeComm(hSerPort, PURGE_RXCLEAR); if(iCount == 0) { //Sleep(100); continue; //没接收到数据,继续下次循环 } //保存数据 TCHAR dlg[128]; wsprintf(dlg, TEXT("received %d bytes.\r\n"), iCount); UpdateHistory((LPARAM)dlg); TCHAR *tmp = new TCHAR[iCount + 1]; if(tmp == NULL) return -1; memcpy(tmp, szText, iCount); lstrcat(tmp, TEXT("\r\n")); UpdateHistory((LPARAM)tmp); //iCount = 0; //Sleep(100); } return 0;}