串口通信程序中十六进制格式发送和接收实现

上位机软件(MFC)发送给三轴步进电机控制器的指令是用hex方式(也就是16进制方式传送的,而不是Ascii码的形式传送的,比如说‘0’,按照Ascii码的方式传送就是48,而以hex的方式传送就是0,),

刚刚用MFC编写了一个采集和设定中央空调控制板上参数的应用程序,控制板和PC机之间通过485转串口和串口转USB电路实现通信。程序设计中碰到一个问题是PC端对发送和接收数据格式的处理,控制板可以读懂的协议是一组16进制数,如“66 03 0C 00 01 00 01 00 00 00 00 00 3C 00 3E F5 94”,PC端应用程序可以解析的也是由控制板发送的一组16进制数,而串口通信是二进制字节流进行,发送和接收缓冲区均为char型的数组,发送时如何将字符串类型的16进制数转换为对应大小的10进制数并存进缓冲数组呢?下面的函数可供参考:

HexChar函数的功能是将16进制字符由ASCII码转为相应大小的16进制数@

//也就是说利用串口调试助手,选中以Hex方式发送到的复选框,则文本框中的字符都是16进制的,在进行传送带之前需要将这些字符转化为10进制的形式,然后在进行传送,也就是HexChar()函数所实现的功能。

char HexChar(char c)

{

    if((c>='0')&&(c<='9')) 

        return c-'0';//16进制中的,字符0-9转化成10进制,还是0-9

    else if((c>='A')&&(c<='F'))

        return c-'A'+10;//16进制中的A-F,分别对应着11-16

    else if((c>='a')&&(c<='f'))

        return c-'a'+10;//16进制中的a-f,分别对应也是11-16,不区分大小写

    else

        return 0x10;   // 其他返回0x10

}

Str2Hex函数的功能则是将如“66 03 ...”形式的字符串以空格为间隔转换为对应的16进制数并存放在BYTE型(typdef unsigned char BYTE)数组中,data数组作为发送缓冲数组写入串口即可。 实际应用中将BYTE数据类型修改为char。也是可以使用的。

下面的函数是将文本框中的字符串,去除空格,然后将其他的字符转换为char型数据和长度,放到数组data中,以方便下面的串口传送。

int Str2Hex(CString str, BYTE *data)

{

    int t,t1;

    int rlen=0,len=str.GetLength();

    if(len==1)

    {

        char h=str[0];

        t=HexChar(h);

        data[0]=(BYTE)t;

        rlen++;

    }

    //data.SetSize(len/2);

    for(int i=0;i<len;)

    {

        char l,h=str[i];

        if(h==' ')

        {

            i++;

            continue;

        }

        i++;

        if(i>=len)

            break;

        l=str[i];

        t=HexChar(h);

        t1=HexChar(l);

        if((t==16)||(t1==16))//D?a¤?¤¡§Ì?16??ºy

            break;

        else

            t=t*16+t1;

        i++;

        data[rlen]=(BYTE)t;

        rlen++;

    }

    return rlen;

}

 

对于接收到的数据,位于接收缓冲区的BYTE数组RecBuf中,如果要以相应大小的16进制形式显示,刚可以将数组中每一个元素以下列格式转换并放入字符串RecText中,即可实现以16进制显示。

下面函数的功能是将char的数据转换为16进制输出。

CString RecText,str;

for(int i=0;i<Rlen;i++)
    {
     str.Format("%02X ",RecBuf[i]);//将接收到的BYTE型数据转换为对应的十六进制
     RecText.Append(str);
    }


  • 30
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Adriano 可以通过使用蓝牙模块来发送十六进制数据。蓝牙是一种无线通信技术,可用于在设备之间传输数据。 要在 Adriano 上发送十六进制数据,首先需要安装和配置蓝牙模块。我们可以选择一款兼容 Arduino 的蓝牙模块,例如 HC-05 或 HC-06。 接下来,我们需要编写 Arduino 代码来实现发送十六进制数据。使用 Serial.write() 函数,我们可以将十六进制数据作为字节发送。 以下是一个示例代码片段,说明了如何使用 Adriano 发送十六进制数据: ```cpp #include <SoftwareSerial.h> SoftwareSerial btSerial(10, 11); // 使用软串口与蓝牙模块通信 unsigned char data[] = {0x12, 0x34, 0xAB, 0xCD}; // 十六进制数据 void setup() { // 初始化串口和蓝牙模块 Serial.begin(9600); btSerial.begin(9600); } void loop() { // 发送十六进制数据 for (int i = 0; i < sizeof(data); i++) { btSerial.write(data[i]); Serial.print("Sent: 0x"); Serial.println(data[i], HEX); delay(1000); } } ``` 在这个示例,我们使用 SoftwareSerial 库来模拟一个串口来与蓝牙模块进行通信。我们首先初始化串口和蓝牙模块通信的波特率,并在主循环使用 btSerial.write() 函数逐个字节地发送十六进制数据。同时,我们使用 Serial.print() 函数将发送的数据打印到串口监视器,以便进行调试。 通过使用类似的代码,Adriano 就可以通过蓝牙模块来发送十六进制数据了。根据你实际的需求,可能需要对代码进行进一步的调整和优化。希望这个回答对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值