Raspberry pi,与串口设备通信
Raspberry pi, communicate with Serial Device
我尝试从 Raspberry pi 与串行设备通信,但没有成功。
我连接,写入数据但从不读回数据。
串行设备在 windows 中工作正常,com 端口上的设置如下 - 波特率:9600,奇偶校验:None,位:8,停止位: 1.
对于通信,我使用 USB 到串行 FTDI 适配器。
我的工作 C 代码是:
int set_interface_attribs(int serialPort)
{
struct termios tty;
if (tcgetattr(serialPort, &tty) < 0) {
printf("Error from tcgetattr: %s\n", strerror(errno));
return -1;
}
printf("Old Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag);
int speed = B9600;
cfsetospeed(&tty, (speed_t)speed);
cfsetispeed(&tty, (speed_t)speed);
tty.c_cflag = CS8 | CLOCAL | CREAD;
tty.c_iflag = IGNPAR;
tty.c_oflag = 0;
tty.c_lflag = 0;
tcflush(serialPort, TCIFLUSH);
if (tcsetattr(serialPort, TCSANOW, &tty) != 0) {
printf("Error from tcsetattr: %s\n", strerror(errno));
return -1;
}
printf("New Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag);
return 0;
}
int main( int argc, char *argv[] ) {
printf("Start program\n");
int serialPort=0;
//if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK))<0) {
if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY))<0) {
printf("Error opening port: %s\n", strerror(errno));
return 1;
}
set_interface_attribs(serialPort);
long n;
char strSend[20];
sprintf(strSend,"98000001%c%c", 0x0D,0x0A);
if ((n = write(serialPort, strSend, strlen(strSend)) ) < 0 ){
perror("Error write to serialPort");
return 0;
}
printf("Write (%d) chars (%s) to serialPort\n", (int)n, strSend);
sleep(1);
printf("Start reading from serialPort\n");
char wData[20];
memset(wData, '[=11=]', sizeof(wData));
if ( (n = read(serialPort, wData, 20) ) <= 0 ){
printf("Error %d read from serialPort\n", (int)n);
} else{
wData[n] = 0;
printf("Read:%d, %s\n", (int)n, wData);
}
printf("Close serialPort\n");
close(serialPort);
return 0;
}
输出是:
Start program
Old Serial port flags, i:4, o:0, c:2224
New Serial port flags, i:4, o:0, c:2224
Write (10) chars (98000001
) to serialPort
Start reading from serialPort
Error 0 read from serialPort
Close serialPort
任何iden或建议;
读写要同步
你应该做一个无限循环。这个 bucle 应该总是在读取端口。
建议将缓冲区做成一个线程(你可以使用 lpthread.h)。
生命周期:
- 配置串口
- 打开串口
- 创建要读取的线程
- 写(测试一下)
- 关闭串口。
另一方面,最好的选择(如果你想测试你的代码)是在 RX 和 TX 引脚上做一个跳线。
所以您写的所有内容都可以阅读。
我尝试从 Raspberry pi 与串行设备通信,但没有成功。
我连接,写入数据但从不读回数据。
串行设备在 windows 中工作正常,com 端口上的设置如下 - 波特率:9600,奇偶校验:None,位:8,停止位: 1.
对于通信,我使用 USB 到串行 FTDI 适配器。
我的工作 C 代码是:
int set_interface_attribs(int serialPort)
{
struct termios tty;
if (tcgetattr(serialPort, &tty) < 0) {
printf("Error from tcgetattr: %s\n", strerror(errno));
return -1;
}
printf("Old Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag);
int speed = B9600;
cfsetospeed(&tty, (speed_t)speed);
cfsetispeed(&tty, (speed_t)speed);
tty.c_cflag = CS8 | CLOCAL | CREAD;
tty.c_iflag = IGNPAR;
tty.c_oflag = 0;
tty.c_lflag = 0;
tcflush(serialPort, TCIFLUSH);
if (tcsetattr(serialPort, TCSANOW, &tty) != 0) {
printf("Error from tcsetattr: %s\n", strerror(errno));
return -1;
}
printf("New Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag);
return 0;
}
int main( int argc, char *argv[] ) {
printf("Start program\n");
int serialPort=0;
//if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK))<0) {
if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY))<0) {
printf("Error opening port: %s\n", strerror(errno));
return 1;
}
set_interface_attribs(serialPort);
long n;
char strSend[20];
sprintf(strSend,"98000001%c%c", 0x0D,0x0A);
if ((n = write(serialPort, strSend, strlen(strSend)) ) < 0 ){
perror("Error write to serialPort");
return 0;
}
printf("Write (%d) chars (%s) to serialPort\n", (int)n, strSend);
sleep(1);
printf("Start reading from serialPort\n");
char wData[20];
memset(wData, '[=11=]', sizeof(wData));
if ( (n = read(serialPort, wData, 20) ) <= 0 ){
printf("Error %d read from serialPort\n", (int)n);
} else{
wData[n] = 0;
printf("Read:%d, %s\n", (int)n, wData);
}
printf("Close serialPort\n");
close(serialPort);
return 0;
}
输出是:
Start program
Old Serial port flags, i:4, o:0, c:2224
New Serial port flags, i:4, o:0, c:2224
Write (10) chars (98000001
) to serialPort
Start reading from serialPort
Error 0 read from serialPort
Close serialPort
任何iden或建议;
读写要同步
你应该做一个无限循环。这个 bucle 应该总是在读取端口。 建议将缓冲区做成一个线程(你可以使用 lpthread.h)。
生命周期:
- 配置串口
- 打开串口
- 创建要读取的线程
- 写(测试一下)
- 关闭串口。
另一方面,最好的选择(如果你想测试你的代码)是在 RX 和 TX 引脚上做一个跳线。
所以您写的所有内容都可以阅读。