社区
C#
帖子详情
串口通信ReadFile
jason176374
2010-10-16 10:29:39
调试串口通信的一个程序。
接收使用ReadFile这个函数。
调试的时候发现,这个函数不会阻塞,也就是说读不到任何信息他也返回。
这样的话,如果对方还没有来得及发送回信的话,可能会造成判断失败。
目前,我是循环一定次数然后读取。但是总觉得循环次数不保险。
请有经验的人给点建议,谢谢。
另外,我这里的接收不能放到线程去做。因为我每次发送的命令接受方都会
返回一个值,代表是否接收完毕校验是否通过的信息。
谢谢
...全文
282
10
打赏
收藏
串口通信ReadFile
调试串口通信的一个程序。 接收使用ReadFile这个函数。 调试的时候发现,这个函数不会阻塞,也就是说读不到任何信息他也返回。 这样的话,如果对方还没有来得及发送回信的话,可能会造成判断失败。 目前,我是循环一定次数然后读取。但是总觉得循环次数不保险。 请有经验的人给点建议,谢谢。 另外,我这里的接收不能放到线程去做。因为我每次发送的命令接受方都会 返回一个值,代表是否接收完毕校验是否通过的信息。 谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jason176374
2010-10-17
打赏
举报
回复
[Quote=引用 7 楼 sp1234 的回复:]
引用 1 楼 3000sunqin 的回复:
接收完全可以放到线程中去做
只要控制好发送代码即可,
起线程收ReadFile,循环一直收,如果收到了数据检查一下是否收到了完整帧数据,如果不完整将数据放入缓冲区内,如果缓冲区内数据已经完整了将这些数据发送给上端数据处理程序处理。
如果你不想使用线程。那么可以使用超时机制来完成,就是发了命令后,等多少毫秒后去读取串口,如果不对就认为超时,进……
[/Quote]
两个线程都在同一个串口上做接收。
数据不会串吗?
3000sunqin
2010-10-16
打赏
举报
回复
接收完全可以放到线程中去做
只要控制好发送代码即可,
起线程收ReadFile,循环一直收,如果收到了数据检查一下是否收到了完整帧数据,如果不完整将数据放入缓冲区内,如果缓冲区内数据已经完整了将这些数据发送给上端数据处理程序处理。
如果你不想使用线程。那么可以使用超时机制来完成,就是发了命令后,等多少毫秒后去读取串口,如果不对就认为超时,进行重发。
松花皮蛋
2010-10-16
打赏
举报
回复
用MOXA 串口卡的 库,比较好用!
以专业开发人员为伍
2010-10-16
打赏
举报
回复
[Quote=引用 1 楼 3000sunqin 的回复:]
接收完全可以放到线程中去做
只要控制好发送代码即可,
起线程收ReadFile,循环一直收,如果收到了数据检查一下是否收到了完整帧数据,如果不完整将数据放入缓冲区内,如果缓冲区内数据已经完整了将这些数据发送给上端数据处理程序处理。
如果你不想使用线程。那么可以使用超时机制来完成,就是发了命令后,等多少毫秒后去读取串口,如果不对就认为超时,进行重发。
[/Quote]
是这样的。
实际上接收工作可以跟解析分开为两个线程,这样就更准确清晰。接收者其实就是循环接收(如果能够由底层的某个消息触发异步接收则比简单地循环更可取)。如果分开两个线程,那么你完全不用担心因为处理命令太慢而丢失该接收的数据,也可以一下子就消除许多看似诡异的问题。
以专业开发人员为伍
2010-10-16
打赏
举报
回复
[Quote=引用楼主 jason176374 的回复:]
因为我每次发送的命令接受方都会
返回一个值,代表是否接收完毕校验是否通过的信息[/Quote]
因此,你的ReadFile就可以以此为根据,循环。
兔子-顾问
2010-10-16
打赏
举报
回复
和这个无关。目前为止,mobile上,我只见过驱动不完整的或没做好的虚拟串口需要用api自己写。
serialport是很完善的。
你用api打开com1成功了么?用serialPort打开com1的错误提示是什么?
mobile设备中,到底哪些是可用的,我们可以在注册表中找到的。或是通过:
System.IO.Ports.SerialPort.GetPortNames()
获得
我的建议是尽量的尝试用SerialPort。
jason176374
2010-10-16
打赏
举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]
如果自己写api读取。那显然不只是用readfile。要先剔除错误数据,串口本身受到干扰时数据不是都正确的,函数名不记得了,不过,你为什么不用System.IO.Ports.SerialPort呢?
[/Quote]
最开始的时候我也想用System.IO.Ports.SerialPort。因为确实简单。
但是我现在做的这个是在WINCE上运行的。硬件本身只有3个串口,而三个
串口都要和下位机连接。
但是System.IO.Ports.SerialPort打开串口COM1的时候,就会报异常。
查了很多资料,没有准确说法。在MSDN论坛上,有人推测是因为一般WINCE的
COM1都是连接调试器的,因此不能打开(至少DEBUG时是这样)。
所以就改用API了,用API确实可以打开这个串口,
但是随之而来的就是自己要处理很多事情。
兔子-顾问
2010-10-16
打赏
举报
回复
如果自己写api读取。那显然不只是用readfile。要先剔除错误数据,串口本身受到干扰时数据不是都正确的,函数名不记得了,不过,你为什么不用System.IO.Ports.SerialPort呢?
yudengchang
2010-10-16
打赏
举报
回复
可以写一个函数,过多长时间进行接收,也就象我们设置邮箱多长时间查询是否有新邮件一样的,通过系统时间来控制.
VC6.0 串口 通信例子WriteFile
ReadFile
方式
在本文中,我们将深入探讨如何在Microsoft Visual C++ 6.0(简称VC6.0)环境下使用串行通信(UART)进行数据传输。通过创建并使用`CreateFile`、`WriteFile`和`
ReadFile
`函数,我们可以实现稳定可靠的
串口通信
。下面...
VC读串口的方法
在计算机与外部设备进行通信时,串行通信是一种常见的数据传输方式。Visual C++ (VC++) 作为一种强大的开发工具,提供了多种方式来实现
串口通信
。本文主要介绍在VC环境下如何读取串口数据。 #### 二、基于API的方法...
C++
串口通信
的例子(实现
串口通信
的类)
串口通信
,也称为串行通信,是数据逐位按顺序进行传输的一种通信方式。与并行通信相比,
串口通信
只需要较少的信号线,因此成本较低,但传输速度相对较慢。常见的串口标准有RS-232、RS-485和USB串口等。 在C++中实现...
完整
串口通信
程序(发送和接受)源代码.zip_串口发送_
串口通信
_
串口通信
代码_串口通讯_通信接受程序
串口通信
,也称为串行通信,是指数据以串行方式一位一位地传输。与并行通信相比,串行通信所需的硬件资源较少,但传输速度相对较慢。在个人计算机上,串口通常指的是RS-232接口,它定义了数据线、控制线以及相应的...
使用Win32API实现Windows下异步串口通讯_异步串口通讯_
在Windows操作系统中,异步
串口通信
是一种高效的数据传输方式,尤其适用于需要处理大量数据流且不影响主线程操作的应用场景。本文将详细讲解如何利用Win32 API来实现这一功能。 1. 异步非阻塞串口通讯的优点 异步...
C#
111,097
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章