串口接收数据怎样存储在数组中呢?

用MSComm控件的事件驱动方式进行数据的接收,接收到的数据怎样存储到数组中呢?
void CSCommTestDlg::OnComm() //接收数据处理
{
// TODO: Add your control notification handler code here
//try{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integer that is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
//在这里加上数据存储到数组的函数么?
}
UpdateData(FALSE); //更新编辑框内容

}

Dim Buffer as Variant 表示声明了一个Buffer变量,但是这个Buffer变量的类型不确定,可以是Long、Integer、Double、Object、String以及数组等等,Buffer变量的类型由编译器自行判断与转换。

Dim Buffer(100) as Variant 表示声明了一个数组Buffer,该数组有100个成员,数组的每一个成员都没有指定具体的数据类型,由编译器自行判断与转换

Dim receive(100) as Byte 表示声明了一个数组receive,该数组有100个成员,数组的每一个成员都是Byte型。

Dim Buffer() as Byte 表示声明了一个数组Buffer,该数组成员数目未知,数组的每一个成员都是Byte型。在确定数组成员数量之前是不能通过Buffer(xx)的这种方式访问Buffer里的成员的。

Dim Buffer() as Byte
.......
'接受
........
Buffer = Mscomm.Input
这种方法实际上是把Mscomm接收缓存里的所有数据读出来并保存到Buffer数组中,Buffer数组的大小由Mscomm接收缓存实际缓存的数据量决定,因为Mscomm的接收缓存里实际的数据量是不确定的,所以不能使用
Dim Receive(100) as Byte
.......
接受数据
Receive = Mscomm.Input
这样的方式。

Dim Receive(100) as Byte
.......
接受数据
Receive(i) = Mscomm.Input
这样是可以的,这样实际上是一次从Mscomm的接收缓存里读一个字节的数据,你这样做不行估计是因为数据传输速率和RThreshold设定的问题,因为赋值语句运行的时间要远比串口传输速率快很多倍,所以你必须等Mscomm的接收缓存里有100个字节以上的数据时你才能通过循环用Mscomm.Input依次读出100个字节的数据,否则就肯定会出错,所以如果你把RThreshold设定为100,也就是每收到100个字节的数据触发一次OnComm事件就可以通过Receive(i) = Mscomm.Input把数据读出来。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-04-25

可以加一个整数索引,对加入的数据长度进行标识。更好的是对这个数据进行扩展,变成一个堆栈,对其进行操作。

#include<stdio.h>
#include<string.h>
#define byte unsigned char
byte queue_buf[20], idx = 0;

void push(byte n) //当串口每接收一个数据,就用push添加一个数据
{
    if (idx < 20)
        queue_buf[idx++] = n;
}

byte pop()
{
    byte ret = 0;
    if (idx-- > 0)
    {
       ret = queue_buf[0];
       memcpy(queue_buf, &queue_buf[1], idx);
    }
    return ret;
}

byte size()
{
    return idx;
}

byte clear()
{
    memset(queue_buf, 0, 20);
    idx = 0;
}

相似回答