楼主需要做一个串口接收数据的程序,一次性接收的数据大概在256KB左右。为了节省内存,定义两个byte[1024]:a[1024]和b[1024],即当a接收满之后传递给b,a继续接收新的数据,b将数据插入数据库,a存满之后继续传递给B,如此往复
那么问题来了:
1、怎么触发a传递给b这个条件呢?
2、怎么把a复制到b(for循环就不要提了= =),楼主试着用memcpy(a,b,1024)可是提示语法错误
------解决思路----------------------
不是应该memcpy(b,a,1024)吗
------解决思路----------------------
1、串口接收数据时,即使是数据块,也不可能一下就收到。串口的驱动层会将每次收到的数据放在底层的缓冲区中,至于你程序中读出的数据,它们应该就来自底层缓冲区。底层数据读出后就被清空,因此不会读到重复的数据。串口函数提供了一个询问指令用于检查缓冲区的长度,可以通过比较前后读到的长度是否相同,判定数据是否读完。一但读完可以一次将底层数据全部读出。
例:
byte myByte[1024];
DWORD dwErrors; // 错误信息
COMSTAT Rcs; // COMSTAT结构通信设备的当前信息
int Len=0;
LOOP:
ClearCommError(hCom,
&dwErrors,
&Rcs); // 获取读缓冲区数据长度
if(Len!=Rcs.cbInQue) // 数据未收完
{
Len=Rcs.cbInQue;
Sleep(3);
goto LOOP; // 再接收
}
if(Len<1) // 无数据
return;
// 读缓冲区并处理收到的数据
------解决思路----------------------
InBufferCount 属性
返回接收缓冲区中等待的字符数。该属性在设计时无效。
语法
object.InBufferCount[ = value ]
InBufferCount 属性的语法包括下列部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 整型表达式,说明在接收缓冲区中等待的字符数。
说明
InBufferCount 是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。可以把 InBufferCount 属性设置为 0 来清除接收缓冲区。
注意 不要把该属性与 InBufferSize 属性混淆。InBufferSize 属性返回整个接收缓冲区的大小。
数据类型
Integer