2 salesman tangseng Salesman_Tangseng 于 2016.09.22 15:36 提问

C++缓存清空确认和采集串口数据

memset(CDataCommunication::USART_Buffer,0,sizeof(CDataCommunication::USART_Buffer));
CDataCommunication::USART_Port.Read(CDataCommunication::USART_Buffer,mRead_length,&mRead);
开了个读串口线程,在线程中进行了两步操作:1、给buffer赋值0,;2、再串口读取数据到buffer
遇到的问题:线程运行多遍下来后,偶尔得到的buffer会全是0
想问一下,是memset发生在read之后导致的吗?怎么解决?有没有确认memset操作完成之后,再进行read的办法

1个回答

yss28
yss28   2016.09.24 00:20

你的现在做法,每次读串口数据之前重置buffer为0。那么是否存在下列情况:

你这个读线程执行较快,一个时刻,你想读1kb数据,但是串口中无数据或者只有0.5kb数据,你打印的1kb的buffer内容就看到了0

一般读串口接口调用后会返回一个实际读到的数据长度,打印buffer时是否用了此值

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
清空串口的缓存及应用
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
linux 清空串口缓存
http://blog.chinaunix.net/uid-20564848-id-74763.html tcflush(int fd, int queue_selector)   //对以写但未发出,或已接收但未读数据的flush. discards data written to the object referred to by fd but not transmitted,
Posix_QextserialPort 清空串口缓存
网上找的串口通信类。开发过程中调用flush函数不起作用,缓冲区还是不能被清空,导致接收很多以前的数据。 修改如下: [cpp] view plaincopyprint? void Posix_QextserialPort::flush()  {      LOCK_MUTEX();      if(isOpen())      {          //Posix_Fi
关于arduino清空串口缓存
在arduino1.0之前的版本 Serial.flush()的作用是是清空串口缓存( dropping received incoming data)。但在1.0之后的版本 Serial.flush()的作用调整为了等待串口数据传送完毕(Waits for the transmission of outgoing serial data to complete.)(引用自http://a
linux如何清空串口接收缓冲区和发送缓冲区数据
http://blog.chinaunix.net/uid-20564848-id-74763.html tcflush(int fd, int queue_selector)   //对以写但未发出,或已接收但未读数据的flush. discards data written to the object referred to by fd but not transmitted,
matlab串口采集数据
底层stm32利用下面格式发送数据sprintf(uartdata,"%.4f",adcdata);UARTprintf(uartdata); UARTprintf("=");matlab利用如下程序接收数据 参考http://blog.sina.com.cn/s/blog_6163bdeb0102e8qc.htmlOpenSerial.m%在matlab命令框中如下输入命令打开串口com2 %s
清空串口缓冲区
缓冲区控制 Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile,  // 返回的句柄 DWORD dwFlags  // 执行的动作 ); 参数hFile指向由Cr
MFC清空串口缓冲区
Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile,  // 返回的句柄 DWORD dwFlags  // 执行的动作 ); 参数hFile指向由CreateFil
如何清除串口缓冲区中的数据
tcflush函数清除串口输入缓存(终端驱动已接到,但用户尚未读取)或串口输出缓存(用户已经写如缓存,但尚未发送)。 函数原型: int tcflush(int filedes,int quene) 参数解释 filedes:  描述符。 quene取值及含义:    *TCIFLUSH  清除输入队列    *TCOFLUSH  清除输出队列    *TCIO
【c语言】清空缓存 的问题
我们使用函数向某个文件从当前流标签所在位置,读取n个字符。我们也会使用函数想文件的某个流位置写如n字符。但是,当这种写的动作小、而频繁。每次写又必须反映到硬盘上,也就是说需要频繁的操作硬盘,写一些小的更改,这是非常耗损效率。所以自然我们想到了,我们设立一个缓冲区,将那些要写如的数据先写到缓冲区中,当缓冲区满,或者其他情况发生的是否,我们在一起将他们写入到硬盘上。这样可以大大提高应用程序读写文件的速