gpt4 book ai didi

c - 使用c从linux中的串口获取二进制数据

转载 作者:太空狗 更新时间:2023-10-29 11:23:28 24 4
gpt4 key购买 nike

我正在使用 Linux 从 Phidg​​et sbc 上的串行端口读取二进制数据,以从 PC 上运行的应用程序获取命令。我用 VB 写了一个测试程序,将数据读入字节数组并将其转换为十进制以使用它,但不知道如何在 c 中执行此操作。我无法根据我在互联网上所做的研究得出任何结论。

从 PC 发送的命令是 0x0F。

为了检查我是否获得了正确的数据,我读取了数据并将其发回。这是我回来的。返回的数据添加了回车符。

十六进制显示 0F00 0000 0D

‘\’显示\0F\00\00\00\r

正常显示只是显示一个奇怪的字符。

这告诉我可以使用数据,但无法提取值 0F 或 15。

如何转换传入数据以使用它?

我尝试使用 strtol 转换接收到的数据,但它返回 0。我也尝试将端口设置为原始端口,但没有任何区别。

unsigned char buffer1[1];
int ReadPort1()
{
int result;

result = read(file1, &buffer1,1);

if(result > 0)
{
WritePort1(buffer1);
sprintf(tempstr, "Port1 data %s %d", buffer1, result);
DisplayText(2,tempstr);
}
return result;
}

端口打开/设置

void OpenPort1()
{
//file1 = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NONBLOCK);
file1 = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NODELAY);

if(file1 < 0)
printf("Error opening serial port1.\n");
else
{
SetPort(file1, 115200, 8, 1, 0, 1);
port1open = 1;
}
}


void SetPort(int fd, int Baud_Rate, int Data_Bits, int Stop_Bits, int Parity, int raw)
{
long BAUD; // derived baud rate from command line
long DATABITS;
long STOPBITS;
long PARITYON;
long PARITY;

struct termios newtio;

switch (Baud_Rate)
{
case 115200:
BAUD = B115200;
break;
case 38400:
BAUD = B38400;
break;
case 19200:
BAUD = B19200;
break;
case 9600:
BAUD = B9600;
break;
} //end of switch baud_rate
switch (Data_Bits)
{
case 8:
default:
DATABITS = CS8;
break;
case 7:
DATABITS = CS7;
break;
case 6:
DATABITS = CS6;
break;
case 5:
DATABITS = CS5;
break;
} //end of switch data_bits
switch (Stop_Bits)
{
case 1:
default:
STOPBITS = 0;
break;
case 2:
STOPBITS = CSTOPB;
break;
} //end of switch stop bits
switch (Parity)
{
case 0:
default: //none
PARITYON = 0;
PARITY = 0;
break;
case 1: //odd
PARITYON = PARENB;
PARITY = PARODD;
break;
case 2: //even
PARITYON = PARENB;
PARITY = 0;
break;
} //end of switch parity

newtio.c_cflag = BAUD | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;

if(raw == 1)
{
newtio.c_oflag &= ~OPOST;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
}
else
{
newtio.c_lflag = 0; //ICANON;
newtio.c_oflag = 0;
}

newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
}

最佳答案

您是否正在寻找数据的十六进制表示形式?

  sprintf(tempstr, "Port1 data %s %x", buffer1, buffer1[0]);

关于c - 使用c从linux中的串口获取二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12479613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com