zhangzhangjie 发表于 2007-9-27 09:48:26

请教一个串口的回调事件

串口的回调事件 LWRS_RXFLAG 是指接收队列中收到一个标志字符,那么这个标志字符是指的是什么字符?另外,怎样在串口的回调函数中接收一串数据,而数据的长度每次不一定一样长。比如这次是5个字节,下次可能是8个字节

hehuxun 发表于 2007-9-27 16:32:16

数据长度不固定 是不是可以考虑使用动态分配内存

zhangzhangjie 发表于 2007-9-27 21:59:09

我是指在串口的回调函数中接收一串数据,而数据的长度每次不一定一样长。比如这次是5个字节,下次可能是8个字节,这个怎么用动态分配内存哦

cpubbs 发表于 2007-9-28 09:17:01

这个字符相当于当串口接收到的内容是这个字符为止,就发生这个事件,比如回车符,或者任意我们自己指定的!像您这种不定长的,用这种方法是比较合适的!好运!

zhangzhangjie 发表于 2007-12-25 15:54:24

如果发送方采用的是数值方式发送,比如16进制,就不好指定标志字符,因为数值是随机的,那又如何接收不定长的数据呢?

zhangzhangjie 发表于 2010-8-25 15:28:00

版主,我也想知道不定长的数据怎样在串口回调函数里面接收呢?

tonwelzt 发表于 2010-8-31 18:00:28

那就只在串口回调函数里面从串口输入缓冲器里把数据取走就是了!这样省得串口回调函数执行时间过长,可能会出现的数据接收不连续.
画曲线的时候另外你可以用异步时钟来做,这样曲线的刷新间隔可由你自己任意设置了.

zhangzhangjie 发表于 2010-9-1 14:36:21

谢谢tonwelzt,今后还须向你学习

zhangzhangjie 发表于 2010-8-31 11:45:17

感谢tonwelzt,问题经过摸索基本解决了.另外我还想请教个问题,我如果要把接收的数据进行处理,如显示,画曲线等等.我又不想在串口回调函数里面进行,那又应该如何呢?

tonwelzt 发表于 2010-8-26 12:30:57

回复 zhangzhangjie 的帖子


    可以自己定义一个数据帧格式啊!
   比如:数据格式为1位起始位+8位数据+1位停止位
               帧格式为      ‘#’ + 符号位+数据位(长度不定)+帧结束标志

                                 ‘#’---------帧起始标志
                                 帧结束标志 要保证所传送的数据中不会出现这个值,要不就会误判断.
                                 比如帧结束标志为:0x0D
    下位机发送数据时就按照定义的帧格式发送.
    上位机在配置串口时,指明数据格式和帧格式就可以了.当上位机接受到 帧结束标志字符时就会产生中断,并启动串口回调函数,此时接受缓冲器里保存的是 帧结束标志 以前的字符串,然后你可以统计这个字符串的长度,再取掉帧起始标志和符号位(共俩个字节),就可以知道所接收的数据为几个字节了.

zhangzhangjie 发表于 2010-8-26 16:46:48

我本来一直是做下位机的,以前做的产品在向上位机发送数据时,从来就没有规定过帧结束标志要有特定的标志.都是随机的采样数据.并且发送的字节数根据意义不同也不一定一样.现在想学习CVI了.所以很想知道不定长(指每次发送的字节数)的数据怎样在串口回调函数里面接收,而且不需要什么固定的结束标志

tonwelzt 发表于 2010-8-26 17:10:35

那也可以啊,关键看你如何配置串口了:
int OpenComConfig (int COMPort, char deviceName[], long baudRate, int parity, int dataBits, int stopBits, int inputQueueSize, int outputQueueSize);
int InstallComCallback (int COMPort, int eventMask, int notifyCount, int eventCharacter, ComCallbackPtr callbackPtr, void *callbackData);
可以声明只要有字符接收,就产生中断,或者接收到一定数量的字符产生中断,参数eventMask可以声明不同的触发条件!

像你这样连续的向上位机发送数据,而没有结束标志,那么你就要及时的从接收缓冲器中取走数据,要不缓冲器就会发生益出.


zhangzhangjie 发表于 2010-8-27 11:08:11

也不是说连续不断的向上位机发送数据,只是说我的下位机数据格式就是: 下位机地址编码+数据位(长度不定而且数值是随机的,也没有什么固定的标志符).所以用LWRS_RECEIVE和LWRS_RXFLAG事件显然不合适.而LWRS_RXCHAR事件每次又只有接收一个字符.所以很想知道针对我的这种下位机发送的数据格式,在CVI里怎样解决呢?

tonwelzt 发表于 2010-8-27 16:55:52

回复 zhangzhangjie 的帖子


         按照你的叙述,每次最先接受的是地址,而数据长度不固定,显然如果为接收固定字节的数据时产生中断,那么有可能某次数据位比较少,一次接收并未产生中断,下次接收时缓冲器中就包含上次接收的数据,那么你如何区分到底那里是地址?那里是数据呢?
      我觉得你最好还是先从你下位机那里考虑,最好是拟定一个通信协议,这样问题就比较简单了.如果你的下位不考虑上位机的接收,没规律的发送,上位机处理起来就不会很流畅的!毕竟上位机的数据接收并产生中断的条件就那么几种.你在做下位机时就应先确定好具体 的通信方式!

zhangzhangjie 发表于 2010-8-30 09:20:44

所以我的意思就是说,在CVI里能够有什么方法,每次都能够正确接收不同长度的数据字节而不另外加什么固定的标识符.
页: [1] 2
查看完整版本: 请教一个串口的回调事件