VC串口发送数据的几个疑问
1.ReadFile这个函数可以一次读取多个字节的数据,我该怎么判断才知道有数据到来然后读取多个字节?2.SetCommMask(hPort,EV_RXCHAR);//设...
1.ReadFile这个函数可以一次读取多个字节的数据,我该怎么判断才知道有数据到来然后读取多个字节?
2.SetCommMask (hPort, EV_RXCHAR); //设置程序响应的事件
WaitCommEvent(hPort, &dwCommModemStatus,0))
利用这两个函数是不是每次串口底层接受一个字节的数据,都会使WaitCommEvent(hPort, &dwCommModemStatus,0))这个函数得到相应,而后的readfile也就只可以读取一个字节了?
3.比如UDP包,我一直在监控,阻塞状态revefrom,
而对方要发送100个字节过来,
我接收方recvfrom不可能在对方刚发送完一半或者4分之一的包后就能收到数据吧?
我接收方肯定要等对方发送完100个字节后才可以从接受缓冲区中把数据一次读上来。
而串口呢:
对方发送100个字节,
而我接收方如果在对方发送了50个字节的时候就读取字节,肯定是把50个字节就读上来了,其他的50个字节得下次再读。
所以TCP和串口的接受还是不一样的吧?
4.也就是是说如果用tcp/ip的时候,一个发送数据就是一个包:意思就是这个包就是个命令格式,不需要加开始字符 转义字符或者结束字符,
但是串口就不一样了:它需要加上开始字符 转义和结束字符,串口的包如果没有这些标志字符的话,就分不清到底哪个是有效数据吧?
5.还是针对第4条,感觉我说的饿串口还是有点乱,应该如果保证串口中读出的数据是自己想要的呢? 展开
2.SetCommMask (hPort, EV_RXCHAR); //设置程序响应的事件
WaitCommEvent(hPort, &dwCommModemStatus,0))
利用这两个函数是不是每次串口底层接受一个字节的数据,都会使WaitCommEvent(hPort, &dwCommModemStatus,0))这个函数得到相应,而后的readfile也就只可以读取一个字节了?
3.比如UDP包,我一直在监控,阻塞状态revefrom,
而对方要发送100个字节过来,
我接收方recvfrom不可能在对方刚发送完一半或者4分之一的包后就能收到数据吧?
我接收方肯定要等对方发送完100个字节后才可以从接受缓冲区中把数据一次读上来。
而串口呢:
对方发送100个字节,
而我接收方如果在对方发送了50个字节的时候就读取字节,肯定是把50个字节就读上来了,其他的50个字节得下次再读。
所以TCP和串口的接受还是不一样的吧?
4.也就是是说如果用tcp/ip的时候,一个发送数据就是一个包:意思就是这个包就是个命令格式,不需要加开始字符 转义字符或者结束字符,
但是串口就不一样了:它需要加上开始字符 转义和结束字符,串口的包如果没有这些标志字符的话,就分不清到底哪个是有效数据吧?
5.还是针对第4条,感觉我说的饿串口还是有点乱,应该如果保证串口中读出的数据是自己想要的呢? 展开
展开全部
通过你的问题,我感觉,你想要一种安全的数据接收方式,那么你需要使用同步方式,同步方式是一种阻塞方式的数据传输,这样你可以安全的获的所有数据。
1.对于问题1,你的问题2既是答案,使用ClearCommError函数,第三个参数.cbInQue可获得缓冲区中未读的数量。
2.从物理上,每次字节到来都会触发EV_RXCHAR,但是毕竟标志位只有1个,当多个字节快速到来时,标志位被重复写入,这种情况下,EV_RXCHAR的触发次数与接收到的字节数是不同的。如果对方的传输速度慢(频度),可以通过ClearCommError这个函数获得缓冲区中有多少个数据没有读出,按照这个数将其一次读出。如果频度比较高,只能使用一个监控线程不断的从缓冲区中读出,直到没有数据为止。
3.这个就是同步和异步的问题了,如果用同步方式,对方传1个,你不接收他是不会传第二个的,但异步方式,不同,不论对方是否接收,数据都会被传输,使用何种方式,看你项目的应用而定。
4.起始位、停止位、校验位,是根据你设定的通信格式,协议芯片帮你加入的,如果你使用标准的串口协议接收的,在你接收到数据时,这些标志都会被清除掉的,即数据在接受方,软件方面是透明的,但这些标志在线上是存在,使用示波器,可以明显的看到。
5.一般地,使用软件协议,即在开始处加上同步头、传输量等,接收方在检测到同步头后开始接收有用数据。
6.补充一下,如果你需要握手,还需要设定EV_CTS、EV_CTS等,这些标志是专门用来控制数据传输是否开始的标志,当然,这也将是硬线增加,这得视你的接口情况来决定是否能使用。
----不知道回答明白没,如需要更详细的,请QQ me[19226004],注明串口问题,我做过很多串口方面的项目,可以交流一下。
1.对于问题1,你的问题2既是答案,使用ClearCommError函数,第三个参数.cbInQue可获得缓冲区中未读的数量。
2.从物理上,每次字节到来都会触发EV_RXCHAR,但是毕竟标志位只有1个,当多个字节快速到来时,标志位被重复写入,这种情况下,EV_RXCHAR的触发次数与接收到的字节数是不同的。如果对方的传输速度慢(频度),可以通过ClearCommError这个函数获得缓冲区中有多少个数据没有读出,按照这个数将其一次读出。如果频度比较高,只能使用一个监控线程不断的从缓冲区中读出,直到没有数据为止。
3.这个就是同步和异步的问题了,如果用同步方式,对方传1个,你不接收他是不会传第二个的,但异步方式,不同,不论对方是否接收,数据都会被传输,使用何种方式,看你项目的应用而定。
4.起始位、停止位、校验位,是根据你设定的通信格式,协议芯片帮你加入的,如果你使用标准的串口协议接收的,在你接收到数据时,这些标志都会被清除掉的,即数据在接受方,软件方面是透明的,但这些标志在线上是存在,使用示波器,可以明显的看到。
5.一般地,使用软件协议,即在开始处加上同步头、传输量等,接收方在检测到同步头后开始接收有用数据。
6.补充一下,如果你需要握手,还需要设定EV_CTS、EV_CTS等,这些标志是专门用来控制数据传输是否开始的标志,当然,这也将是硬线增加,这得视你的接口情况来决定是否能使用。
----不知道回答明白没,如需要更详细的,请QQ me[19226004],注明串口问题,我做过很多串口方面的项目,可以交流一下。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询