二进制数据收发

串口通讯程序在大部分情况下都采用二进制数据收发
利用 Read 和 Write 方法, 可发送和接收任意类型的数据。

例(1), 发送简单数据类型 :

char a[10];
AnsiString s;
short n;

YbCommDevice1->Write(a,10); //发送字符数组
YbCommDevice1->Write(s.c_str(),s.Length()); //发送字符串
YbCommDevice1->Write(&n,2); //发送一个 16 位的短整数, 先发送低位字节, 后发送高位字节


例(2), 发送结构 :

#pragma pack(push,1) //用字节型对齐方式,下面的 TMyStruct 结构是 7 个字节, 否则 TMyStruct 结构是8个字节
typedef struct
{
char a; //字节型变量, 1 个字节
short b; //短整数变量, 2 个字节
long c; //长整数变量, 4 个字节
} TMyStruct;
#pragma pack(pop) //恢复原来的对齐方式

TMyStruct MyStruct; //定义结构变量
YbCommDevice1->Write(&MyStruct,sizeof(TMyStruct));


例(3), 接收数据 :

char Buffer[8192]; //定义一个 8kb 缓存
int n = YbCommDevice1->Read(Buffer,8192); //收到 n 个字节, 接收的数据保存到 Buffer 里


例(4), 完整的例子 :

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
    try
    {
        YbCommDevice1->PortNo = 1; //COM1
        YbCommDevice1->Active = true;
    }
    catch(Exception &e)
    {
        ShowMessage("YbCommDevice1: "+e.Message);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSet1Click(TObject *Sender)
{
    YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonSend1Click(TObject *Sender)
{
    int nBytes = 0;
    char Buffer[1000], *EndPtr;
    AnsiString t,s = Edit1->Text.Trim();
    while(s.Length()>0)
    {
        int p = s.Pos(' '); //空格
        if(p>0)
        {
            t = s.SubString(1,p-1);
            s = s.SubString(p+1,s.Length()).Trim();
            Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16); //十六进制字符串转成字节
        }
        else //还剩下最后一个字节
        {
            t = s;
            s = "";
            Buffer[nBytes++] = strtol(t.c_str(), &EndPtr, 16); //十六进制字符串转成字节
        }
    }
    YbCommDevice1->Write(Buffer,nBytes);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    unsigned char Buf[8192]; //收到的字节数不会超过串口缓存的容量, 所以分配一个缓存容量相同的Buf
    int n = YbCommDevice1->Read(Buf,8192); //收到 n 个字节
    AnsiString s;

    for(int i=0; i<n; i++)
        s += IntToHex(Buf[i],2) + " ";
    s = s.Trim();

    if(!s.IsEmpty())
        Memo1->Lines->Add(s);
}
//---------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LIN收发器主要负责将MCU(微控制器单元)发送的二进制数据转换成LIN语句,并将接收到的LIN语句转换成MCU可读取的数据。 下面是一般的二进制到LIN语句的转换过程: 1. 构建LIN帧:根据LIN协议规范,将MCU的二进制数据打包成LIN帧。LIN帧由帧头、标识符、数据和校验位组成。帧头包含同步字段和帧ID,标识符用于区分不同的LIN消息,数据部分存储MCU发送的数据,校验位用于验证数据的完整性。 2. 转换为LIN语句:根据LIN协议规范和LIN收发器的工作原理,将构建好的LIN帧转换为对应的LIN语句。LIN语句一般由起始位、数据位、校验位和结束位组成。起始位和结束位用于标识一个LIN帧的开始和结束,数据位包含帧头、标识符和数据,校验位用于验证数据的完整性。 3. 发送LIN语句:将转换后的LIN语句通过LIN收发器发送到总线上。LIN收发器负责将LIN语句转换成电信号,并发送到总线上进行通信。 在接收端,LIN收发器会执行相反的操作: 1. 接收LIN语句:LIN收发器从总线上接收到LIN语句,并将其转换成对应的二进制数据。 2. 解析LIN帧:根据LIN语句中的起始位、数据位、校验位和结束位,将收到的LIN语句解析成LIN帧。解析过程包括提取帧头、标识符、数据和校验位等信息。 3. 提取数据:从LIN帧中提取出MCU需要的数据,并将其传递给MCU进行处理。 需要根据具体的LIN收发器和MCU的通信要求,参考相关的文档和使用手册来实现正确的二进制到LIN语句的转换操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值