weixin_53091980
2021-01-15 16:09
采纳率: 50%
浏览 276

树莓派用C语言怎么编程向串口传送16进制数组

因为在电脑上,可以输入03 01 00 02 00 c4这样的一组数,然后使用hex传送可以以16进制数组传送给串口,然后得到应答,在树莓派上的xgcom也实现了以上操作,得到了应答,但是在编程序向串口传送数据时,就传送出去是3 1 0 2 0 196这样的十进制数组,就得不到串口连接的传感器的反馈,请问这样的问题应该怎么解决,因为十进制数穿换成十六进制数简单,但是转换出来就是char类型的字符串,就不是数组数据了

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

11条回答 默认 最新

  • Lj2_jOker 2021-01-15 19:08
    已采纳

    你的串口设备波特率是多少? 你现在设置的是9600

    看看是否为115200

    你可以使用write函数

    传参数的时候转成(void *)Indate 就行了

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • weixin_53091980 2021-01-15 18:20

    现在是可以用%x按照16进制输出,输出了1 3 0 0 0 2 c4 b,这样输入在xgcom例也能得到应答,但是程序里还是不能实现,除了write还尝试过serialPrintf(fd, Indate);也不行,

    char Indate[8];

       
    int main(void)
    {
        int fd;
        if ((fd = serialOpen("/dev/ttyUSB0", 9600)) < 0)
        {
            if ((fd = serialOpen("/dev/ttyUSB1", 9600)) < 0)
            {
                fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
                return 1 ;
            }
        }
        serialPuts(fd, "uart send test, just by launcher\n");
        
        Indate[0] = 0x01;
        Indate[1] = 0x03;
        Indate[2] = 0x00;
        Indate[3] = 0x00;
        Indate[4] = 0x00;
        Indate[5] = 0x02;
        Indate[6] = (char)0xc4;
        Indate[7] = (char)0x0b;
        int j = 0;
        while(j < 8)
        {
            printf("%x ", Indate[j]);
            j++;
        }
        serialPrintf(fd, Indate);
        while(1)
        {
            printf("缓冲区为%d位", serialDataAvail(fd));
            if (serialDataAvail(fd) > 0)
            {
                printf("?");
                putchar(serialGetchar(fd));
                fflush (stdout) ;    
            }
            break;
        }
        return 0;
    }

    得到的

    评论
    解决 1 无用
    打赏 举报
  • weixin_53091980 2021-01-15 16:11

    这是xgcom实现的,不知道用程序怎么实现hex传送了

    评论
    解决 无用
    打赏 举报
  • Lj2_jOker 2021-01-15 16:36

    串口传的是2进制的数据啊,10进制和16进制都只是显示的问题

    串口write和read的数据类型是char

    通过(unsigned char)转换成无符号类型就可以了

    评论
    解决 无用
    打赏 举报
  • weixin_53091980 2021-01-15 16:51

    unsigned int Indate[8];

     
    int main(void)
    {
        int fd;
        if ((fd = serialOpen("/dev/ttyUSB0", 9600)) < 0)//检查USB0是否连接
        {
            if ((fd = serialOpen("/dev/ttyUSB1", 9600)) < 0)//检查USB1是否连接
            {
                fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
                return 1 ;
            }
        }
        serialPuts(fd, "uart send test, just by launcher\n");
        
        Indate[0] = 0x01;//给数组赋值
        Indate[1] = 0x03;
        Indate[2] = 0x00;
        Indate[3] = 0x00;
        Indate[4] = 0x00;
        Indate[5] = 0x02;
        Indate[6] = 0xc4;
        Indate[7] = 0x0b;
        int j = 0;
        while(j < 8)
        {
            printf("%d ", Indate[j]);//先输出,结果最后c4和0b显示的是196和11,就被转化为10进制数了
            j++;
        }
        write(fd, Indate, 8);//测试出来传送失败
        //close(fd);
       
        
        while(1)
        {
            printf("!%d", serialDataAvail(fd));//得到 serialDataAvail(fd)=0,说明缓冲区没有反馈
            if (serialDataAvail(fd) > 0)
            {
                putchar(serialGetchar(fd));
                fflush (stdout) ;    
            }
        }
        return 0;
    }

    测试出来是这样,现在越来越糊涂,不知道怎么下手了

    评论
    解决 无用
    打赏 举报
  • Lj2_jOker 2021-01-15 17:12

    unsigned int Indate[8];

    改为 char Indate[8];

    Indate[0] = 0x01;//给数组赋值
    Indate[1] = 0x03;
    Indate[2] = 0x00;
    Indate[3] = 0x00;
    Indate[4] = 0x00;
    Indate[5] = 0x02;
    Indate[6] = (char)0xc4;
    Indate[7] = (char)0x0b;

    printf("%d") 是作为10进制输出

    printf("%x") 是16进制输出

     

    串口传的最大是8bit数据

    你unsigned int是16bit数据

    评论
    解决 无用
    打赏 举报
  • Lj2_jOker 2021-01-15 17:13

    看看write函数,它传入的是什么参数类型

    评论
    解决 无用
    打赏 举报
  • weixin_53091980 2021-01-15 18:04
    ssize_t write(int fd,const void*buf,size_t count);
    参数说明:
      fd:是文件描述符(write所对应的是写,即就是1)
      buf:通常是一个字符串,需要写入的字符串
      count:是每次写入的字节数
    
    • 所以是要做成字符串形式来传递么,就现在我对于串口接收的数据类型是十六进制,二进制,ASCII码还是字符串还是其他的比较模糊
    评论
    解决 无用
    打赏 举报
  • weixin_53091980 2021-01-16 14:47

    波特率改了,传参数也是

    int a = 0;
        a = write(fd, (void *)Indate, 8);
        printf("a = %d", a);

    但结果还是和之前一样

     

    评论
    解决 无用
    打赏 举报
  • weixin_53091980 2021-01-16 15:26

    因为在xgcom和电脑端串口调试程序中都有停止位、奇偶校验位等参数的设置,这里程序里面需不需要体现,如果需要怎么体现呢?

    评论
    解决 无用
    打赏 举报
  • weixin_53091980 2021-01-16 16:36

    哇欧数据出来了,我把输入数据的语句放到了循环里,循环3次之后缓冲区出现了数据,虽然现在数据还有点问题,但是还是非常感谢你!!!

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题