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

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

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

看看是否为115200

你可以使用write函数

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

现在是可以用%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;
}

得到的

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

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

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

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

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;
}

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

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数据

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

ssize_t write(int fd,const void*buf,size_t count);
参数说明:
  fd:是文件描述符(write所对应的是写,即就是1)
  buf:通常是一个字符串,需要写入的字符串
  count:是每次写入的字节数
  • 所以是要做成字符串形式来传递么,就现在我对于串口接收的数据类型是十六进制,二进制,ASCII码还是字符串还是其他的比较模糊

波特率改了,传参数也是

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

但结果还是和之前一样

 

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

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