返回信息流最近接到一个任务,是做一个计算机之间串口通信的程序,不能使用MSComm控件,实现一个基本的串口通信协议来完成文件传送。
(1) 一个发送程序,一个接收程序
(2) 基于RS232
(3) 可以对通信参数进行设置
(4) 将包含串口协议的内容封装到dll中,主工程调用dll,具体定义dll的封装说明,方便其他程序调用。
这里不知道应该怎么做,主要是不明白第四点,把串口协议内容封装到dll中的意思是把关于串口的参数设置比如波特率、起始位、数据位、结束位等的定义写到dll中吗?我记得win API是已经是有一个DCB数据结构封装了串口通信所需要的参数的,所以有点疑惑。那串口的相关操作应该写进dll里去吗?
相关的项目经验真的缺乏,不知道怎么做,请教一下大神们
这是一条镜像帖。来源:北邮人论坛 / communications / #24738同步于 2014/8/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Communications机器人发帖
[问题]串口通信
FromMars
2014/8/6镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
4说的应该是封装是串口协议吧?串口物理层的时序是控制不了的,只能配置。
不用mscomm控件,可以使用windows提供的api。
没有给你规定串口通信的协议吗?就是一个帧多长,帧内各个字段都表示什么含义等等。
使用标准协议==
监听串口事件、接收字符,这一块还有一些疑惑
特别是看到有些代码使用了界定符:
InitializeCriticalSection(&_Mutex)
【 在 afeionline 的大作中提到: 】
: 4说的应该是封装是串口协议吧?串口物理层的时序是控制不了的,只能配置。
: 不用mscomm控件,可以使用windows提供的api。
: 没有给你规定串口通信的协议吗?就是一个帧多长,帧内各个字段都表示什么含义等等。
只是说了标准协议
最终结果是:传送的文件能够正确接收,比如,传一个exe文件接收后能打开等等
现在不太懂的是,协议的内容,我看到很多的设置串口参数:开始位,数据位8,检验位(1),结束位(1)
这些知道怎么做,但是像
传送步骤、纠错、同步方式、数据格式、控制字符定义等等都不是很懂,代码实现
【 在 afeionline 的大作中提到: 】
: 4说的应该是封装是串口协议吧?串口物理层的时序是控制不了的,只能配置。
: 不用mscomm控件,可以使用windows提供的api。
: 没有给你规定串口通信的协议吗?就是一个帧多长,帧内各个字段都表示什么含义等等。
什么叫重叠方式??
【 在 FromMars 的大作中提到: 】
: 使用rs232串口传送文件的话,是穿件的时候是使用同步方式还是重叠方式好?或者都无所谓?
串口是异步的,没有同步机制。
所有文件都可以当做二进制文件传送。
传送方式最简单的,定义一个帧格式,比如每帧最多传1024个有效字节,帧头上带上本次任务号,这个任务一共有多少帧,当前是第几帧,这一帧里面有多少字节有效数据等等,帧尾加上一个简单的奇偶校验,或者复杂点搞个CRC校验。收端收到后校验过了就给个ACK,校验不过就NACK,要求对端重传当前帧。
传完了对端自然就可以组起来这个文件。文件名可以再通过另一种格式的帧发过来,ok了吧?
文件读写操作,OVERLAPPED or NOVERLAPPED
串口的话,只能是OVERLAPPED么?
【 在 afeionline 的大作中提到: 】
: 什么叫重叠方式??
明白多了,就是底层串口读写操作和通信协议有点混淆概念模糊
设置串口读写缓冲区为1024、波特率等等,
然后,
往串口write()和read()的时候,使用重叠方式或者是同步方式(这里取决于creatfile创建串口时所选取的属性),这里读写的是byte*的数据。
再往上面一层,就是通信协议层
对于文件传送,一般是要把文件名、大小、内容这些信息传送过去,信息大多数情况是大于1024的,所以要分为一帧帧,把要传送的信息分成data1,data2,data3.。。。dataN,然后再把每一份数据放在一个帧里面,构造一个结构体
struct datapack{byte 地址,byte 控制码,byte 报文序号,byte dataN,byte 校验}
计算好这些结构体数据包后,再这些帧通过串口write出去,接收方串口read后,存到一个byte*get里头,然后根据byte*get还原出来对应的struct datapack{},计算校验,若正确,发送回应的数据包struct redatapacket{byte ACK or NACK,byte 收到字节数,byte 序号。。。},发送方收到这些回复数据读取出来决定重发或者是发送下一个帧,
循环上面的发送步奏,直到所有的data都发送完,发送方就发送一个终止数据包,struct enddatapacket{}
接收方收到后,知道发送完成了,不再发送回应包struct redatapacket{},这样,终止了通信
接收方收到所有数据包后,再依次提取出data,然后重新组装成文件。
是这样理解么?
【 在 afeionline 的大作中提到: 】
: 串口是异步的,没有同步机制。
: 所有文件都可以当做二进制文件传送。
: 传送方式最简单的,定义一个帧格式,比如每帧最多传1024个有效字节,帧头上带上本次任务号,这个任务一共有多少帧,当前是第几帧,这一帧里面有多少字节有效数据等等,帧尾加上一个简单的奇偶校验,或者复杂点搞个CRC校验。收端收到后校验过了就给个ACK,校验不过就NACK,要求对端重传当前帧。
: ...................
嗯,很完整的一个流程。
【 在 FromMars 的大作中提到: 】
: 明白多了,就是底层串口读写操作和通信协议有点混淆概念模糊
: 设置串口读写缓冲区为1024、波特率等等,
: 然后,
: ...................