注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在ReadFile()也必须使用
LPOVERLAPPED结构.否则,函数会不正确地报告读操作已完成了.
使用LPOVERLAPPED结构, ReadFile()立即返回,不必等待读操作完成,实现非阻塞
通信.此时, ReadFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.
if (!fReadStat){
if (GetLastError() == ERROR_IO_PENDING){
while(!GetOverlappedResult(hCom,READ_OS( npTTYInfo ),dwBytesRead, TRUE )){
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE) continue;//缓冲区数据没有读完,继续
…… ……
::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据}
所谓的非阻塞通信 , 也即异步通信 。是指在进行需要花费大量时间的数据读写操作(不仅仅是指串行通信操作)时,一旦调用ReadFile()、WriteFile(), 就能立即返回,而让实际的读写操作在后台运行;相反 , 如使用阻塞通信,则必须在读或写操作全部完成后才能返回 。由于操作可能需要任意长的时间才能完成,于是问题就出现了 。
非常阻塞操作还允许读、写操作能同时进行(即重叠操作?),在实际工作中非常有用 。
要使用非阻塞通信 , 首先在CreateFile()时必须使用FILE_FLAG_OVERLAPPED;然后在 ReadFile()时lpOverlapped参数一定不能为NULL , 接着检查函数调用的返回值,调用GetLastError() , 看是否返回ERROR_IO_PENDING 。如是,最后调用GetOverlappedResult()返回重叠操作(overlapped operation)的结果;WriteFile()的使用类似 。
⑸.在主线程中发送下行命令 。
BOOLfWriteStat ; char szBuffer[count];
…………//准备好发送的数据,放在szBuffer[]中
fWriteStat = WriteFile(hCom, szBuffer, dwBytesToWrite,
dwBytesWritten, WRITE_OS( npTTYInfo ) ); //写数据
//我在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在WriteFile()也必须使用LPOVERLAPPED结构.否则,函数会不正确地报告写操作已完成了.
使用LPOVERLAPPED结构,WriteFile()立即返回,不必等待写操作完成,实现非阻塞 通信.此时, WriteFile()返回FALSE, GetLastError()返回ERROR_IO_PENDING.
int err=GetLastError();
if (!fWriteStat) {
if(GetLastError() == ERROR_IO_PENDING){
while(!GetOverlappedResult(hCom, WRITE_OS( npTTYInfo ),
dwBytesWritten, TRUE )) {
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE){// normal result if not finished
dwBytesSent += dwBytesWritten; continue; }
......................
//我使用了多线程技术,在辅助线程中监视串口,有数据到达时依靠事件驱动,读入数据并向主线程报告(发送数据在主线程中,相对说来 , 下行命令的数据总是少得多);并且,WaitCommEvent()、ReadFile()、WriteFile()都使用了非阻塞通信技术,依靠重叠(overlapped)读写操作,让串口读写操作在后台运行 。
VB.NET串口通讯怎么发送和接收十六进制?串口通信最终都是用二进制传输的,你用代码把二进制转化成十六进制就可以了 。不需要额外设置 。
vb.net 串口收发数据有问题不知道你是不是用51单片机往串口发数据,是的话那是因为51的sbuf最多存放8个字节 , 所以你发12个字节会分成两次发完 。还有在接收的时候最好定义好通信协议 , 比如加一个侦头,一个侦尾 , 通过这两个字节的内容来接收数据 。
老兄,提问还是给点悬赏分嘛,不要吝啬哪点分,知识是无价的,你给得越多,回答你的人才会越多 。
VB.NET中,串口接收数大量数据时如果执行SerialPort.close动作,程序会卡死在这里对同一个串口vb.net串行端口的操作应该放在单个线程里vb.net串行端口,你vb.net串行端口的程序应该将串口接收和串口关闭的执行都放在一个线程里进行 , 这样在接收数据的间隙就可以正常执行close动作 。而不会造成两个线程都在操作串口 。
推荐阅读
- oracle指定索引查询,oracle指定索引写法
- android应用常用代码,android 代码规范
- css网页样式写法,css网页样式写法怎么写
- C语言中fbs函数 c语言中fp
- mysql存储多个参数,mysql存储过程多个参数
- chatgpt嵌入式开发,嵌入式开发路线
- 图标软件下载,图标软件下载手机版
- java代码给apk打包 java怎么打包apk
- 秀米小程序的图文怎么分享,秀米图文怎么分享到微信