windows串口通信c(4)
来源:互联网 发布:淘宝客服和文员哪个好 编辑:程序博客网 时间:2024/06/03 13:17
overlapped读取
#include <windows.h>#include <cstdio>#include <iostream>#include <string>#include <vector>const char* StopBitsFromInt(int s) { switch (s) { case ONESTOPBIT: return "1 stop bits"; case ONE5STOPBITS: return "5 stop bits"; case TWOSTOPBITS: return "2 stop bits"; } return "Unknown stop bits";}const char* ParityFromInt(int s) { switch (s) { case NOPARITY: return "no-parity"; } return "other parity";}HANDLE MustOpenCommport() { HANDLE hComm = CreateFile(L"\\\\.\\COM4", //port name GENERIC_READ | GENERIC_WRITE, //Read/Write 0, // No Sharing NULL, // No Security OPEN_EXISTING, // Open existing port only FILE_FLAG_OVERLAPPED, // Non Overlapped I/O NULL); // Null for Comm Devices if (INVALID_HANDLE_VALUE == hComm) { std::cerr << "Error in opening serial port" << std::endl; ExitProcess(-1); } else { //std::cout << "opening serial port successful" << std::endl; } //CloseHandle(hComm);//Closing the Serial Port return hComm;}void ShowCommStatus(HANDLE hComm) { DCB dcbParams = { sizeof(DCB) }; BOOL status = GetCommState(hComm, &dcbParams); std::cout << "Baudrate:" << dcbParams.BaudRate << std::endl; std::cout << "Parity:" << ParityFromInt(dcbParams.fParity) << std::endl; std::cout << "ByteSize:" << int(dcbParams.ByteSize) << std::endl; std::cout << "StopBit:" << StopBitsFromInt(dcbParams.StopBits) << std::endl;}int main() { int a = sizeof(DWORD); HANDLE hComm = MustOpenCommport(); DCB dcbParams = { sizeof(DCB) }; //std::cout << "setting ...\n\n" << std::endl; dcbParams.BaudRate = CBR_128000;// CBR_256000;// CBR_9600; dcbParams.ByteSize = 8; dcbParams.StopBits = ONESTOPBIT; // 1 dcbParams.Parity = NOPARITY; BOOL setOK = SetCommState(hComm, &dcbParams); if (!setOK) { std::cerr << "error setting comm-state" << std::endl; ExitProcess(-1); } //ShowCommStatus(hComm); // The rest are copied from tarm's golang version. SetupComm(hComm, 64, 64); if (!SetCommMask(hComm, EV_RXCHAR)) { std::cerr << "error_category set-comm mask" << std::endl; ExitProcess(-1); } COMMTIMEOUTS timeouts = { 0 }; const DWORD maxWord = (1LL << 32) - 1; timeouts.ReadIntervalTimeout = 50; timeouts.ReadTotalTimeoutMultiplier = 10; timeouts.ReadTotalTimeoutConstant = 50;//in milliseconds SetCommTimeouts(hComm, &timeouts); OVERLAPPED osReader = { 0 }; osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!osReader.hEvent) { std::cerr << "Cannot create-event" << std::endl; ExitProcess(-1); } BOOL fWaitingOnRead = FALSE; char buffer[2]; while (1) { ResetEvent(osReader.hEvent); buffer[0] = 0; DWORD dwRead = 0; if (!fWaitingOnRead) { dwRead = 0; if (!ReadFile(hComm, buffer, sizeof(buffer) - 1, &dwRead, &osReader)) { if (GetLastError() != ERROR_IO_PENDING) { std::cerr << "\nerror overlapping read" << std::endl; } else { fWaitingOnRead = TRUE; } } else { buffer[dwRead] = 0; //std::cout << "<" << buffer << ">"; } } if (fWaitingOnRead) { DWORD dwRes = WaitForSingleObject(osReader.hEvent, 500); switch (dwRes) { case WAIT_OBJECT_0: dwRead = 0; if (!GetOverlappedResult(hComm, &osReader, &dwRead, FALSE)) { std::cerr << "Error getting result" << std::endl; } else { buffer[dwRead] = 0; } fWaitingOnRead = FALSE; break; case WAIT_TIMEOUT: break; default: std::cerr << "error in switching-case wait-for-single-object" << std::endl; break; } } if (dwRead > 0) { std::cout << buffer; buffer[0] = 0; } } CloseHandle(hComm);}
如果CreateFile时候没有指定FILE_FLAG_OVERLAPPED,那么所有的overlapped都不会发生.
阅读全文
0 0
- windows串口通信c(4)
- Windows串口通信(上)
- Windows串口通信(下)
- Windows api 串口通信
- C#-WinForm 串口通信
- C# 串口通信
- C#--01--串口通信
- Windows CE下串口通信
- Windows CE下串口通信
- Windows 下串口通信(上)
- Windows 下串口通信(下)
- Windows CE 串口通信编程
- Windows 串口通信简单示例
- Linux与Windows串口通信
- 一个C串口通信程序
- C#SerailPort串口通信Demo
- 51串口通信 C程序
- C#---串口通信---位操作
- android wifi direct代码开启和设置名称密码的权限
- 学习C语言的第六天
- (转)Android onSaveInstanceState()和onRestoreInstanceState()调用时机
- HTML
- Python实现文章自动生成
- windows串口通信c(4)
- HashMap与ConcurrentHashMap
- NIPS风波 | 获奖者登台开炮:ML是炼金术,大神LeCun强硬回怼
- AlphaZero完胜三大世界冠军棋类程序:5000个TPU、自学一天
- 史上最全JavaEE基础体系图解(xmind)
- tomcat 高并发配置 与优化
- 高可用的Mysql双机热备(Mysql_HA)
- 报名 | 旷视研究院解读COCO2017人体姿态估计竞赛冠军论文
- 图形用户界面-2