因为在电脑上,可以输入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:是每次写入的字节数
波特率改了,传参数也是
int a = 0;
a = write(fd, (void *)Indate, 8);
printf("a = %d", a);
但结果还是和之前一样
因为在xgcom和电脑端串口调试程序中都有停止位、奇偶校验位等参数的设置,这里程序里面需不需要体现,如果需要怎么体现呢?
哇欧数据出来了,我把输入数据的语句放到了循环里,循环3次之后缓冲区出现了数据,虽然现在数据还有点问题,但是还是非常感谢你!!!