- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在尝试通过/dev/ttyS 设备在 Linux 上执行串行通信,但是当我在写入后尝试从它们读取数据时,我没有读取到任何数据。
我有以下代码
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
int main() {
printf("hello world\n");
int n;
int fd;
char c;
int bytes;
char buffer[10];
char *bufptr;
int nbytes;
int tries;
int x;
struct termios options;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
if(fd == -1) {
perror("open_port: Unable to open:");
} else
tcgetattr(fd, &options);
// Set the baudrate, same speed for both I/O
cfsetispeed(&options, B150);
cfsetospeed(&options, B150);
// Enable reading
options.c_cflag |= (CLOCAL | CREAD);
// Set 'RAW' mode
cfmakeraw(&options);
// Set byte size
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
// Set parity
// options.c_cflag &= ~PARENB;
options.c_cflag |= PARENB;
options.c_cflag |= PARODD;
options.c_cflag &= ~CSTOPB;
// Set StopBits, @Linux no OneHalf is supproted, so OneHalf and Two are the same
options.c_cflag &= ~CSTOPB;
// Set Handshake options
// options.c_iflag |= CRTSCTS;
// options.c_iflag &= ~CRTSCTS;
// options.c_cflag &= ~( IXON | IXOFF | IXANY );
options.c_cflag |= IXON | IXOFF | IXANY;
// Set Timeouts
options.c_cc[VMIN] = 0; // read() will return after receiving character
options.c_cc[VTIME] = 10; // == 0 - infinite timeout, != 0 - sets timeout in deciseconds
tcsetattr(fd, TCSANOW, &options);
tcflush(fd, TCIOFLUSH);
bytes = write(fd, "ATZ\r",4);
printf(" wrote %d bytes\n", bytes);
bufptr = buffer;
bytes = read(fd, bufptr, sizeof(buffer));
printf("number of bytes read is %d\n", bytes);
perror ("read error:");
for (x = 0; x < 10 ; x++) {
c = buffer[x];
printf("%d ",c);
}
tcflush(fd, TCIOFLUSH);
close(fd);
printf("\n");
return (0);
}
程序输出如下
hello world
wrote 4 bytes
number of bytes read is 0
read error:: Success
0 0 0 0 0 0 0 0 0 0
虽然我希望它能读取我刚写的 4 个字符,但它似乎读取了 0 个字节。如果我将 VTIME 设置为 0,则永远读取 block 。我尝试执行 echo/dev/ttyS0
但没有输出。知道是什么原因造成的吗?如何解决?
最佳答案
您的代码显然没问题,除了以下事实:
您调用 perror("read error");
在调用 printf(3)
之后, 而不是在 read(2)
之后 因此可能的错误(如果发生)被屏蔽到对 read(2)
的调用调用printf(3)
.如果要打印读取字符数,保存errno
的值和来自 read(2)
的返回值打电话前printf(3)
,然后,如果返回的错误为负,则调用 perror(3)
.
无论如何。 c_cc[VTIME] = 10
施加一秒超时,这对于重置调制解调器来说太过分了。您的线路设置是:
CS8, Parity ODD, one STOP bit, and 150 baudrate
通常,调制解调器会响应 ATZ\r
命令重置后,这需要一些时间(通常超过一秒)并且以默认调制解调器速度(因为您已重置它)并且不是这个速度您已发送 AT
命令。
出于这个原因,重置调制解调器通常是盲目的,然后您发送一个简单的 AT\r
命令,为了请求 \r\nOK\r\n
回复。 AT\r
的答案命令通常是即时的,而不是作为对重置命令的响应,并让调制解调器根据接收到的字符调整其通信设置。
调制解调器总是在 A
时调整它们的速度和 T
接收到序列,通过对以高采样频率接收到的方波脉冲进行采样,然后它们将速度切换到检测到的速度并通常进行速度转换(使得可以以不同于远程协商的速度与调制解调器通信)
关于c++ - 写入/dev/ttyS0 后读取 0 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58537101/
获取Linux系统上所有可用串行端口/设备列表的正确方法是什么? 换句话说,当我遍历/dev/中的所有设备时,如何分辨经典的串行端口,即通常支持波特率和RTS/CTS流量控制的那些端口? 解决方案将用
我不是 Linux 或串口编程专家,我对 Linux 串口通信的理解是:系统将某个/dev/ttyS* 文件链接到某个物理串口,然后系统或其他程序可以通过/dev/ttyS* 文件与连接到该串口的任何
我的问题是这样的 - 如何在 uCLinux 2.6.21 中同步调用 write() ,即调用在发送结束之前未完成?现在我有以下代码: //... fd = open (PORT, O_RDWR |
我看到我可以执行 freopen 将去往控制台的标准输出重定向到另一个 tty。我正在尝试将其重定向到包括控制台在内的多个终端。控制台是程序运行的地方。最好的方法是什么? TIA 最佳答案 您没有指定
我正在用 C 编写程序,但我不知道如何检查 ttyS 的输出缓冲区。我想知道我还能写入多少个字符,或者那一刻的传输器是否还在工作 最佳答案 大多数串口驱动都支持 int count = 0; ioc
为了捕获 ssh session ,我使用“script”命令:“script -c 'ssh user@host' outfile”。但是我不知道如何捕获通过 com(串行)端口连接的远程主机的 s
有人知道是否可以在 ttys 之间转移工作吗? 例子:在 ttys004 开始一项工作,按 Ctrl+Z 将其分离,键入 bg 1 将其移至后台。然后我想从示例 ttys002 中获取它。 最佳答案
获取 Linux 系统上所有可用串行端口/设备列表的正确方法是什么? 也就是说,当我遍历/dev/中的所有设备时,如何以经典的方式判断哪些是串口,即那些通常支持波特率和RTS/CTS流量的设备控制?
当 Qt 应用程序使用 QSerialPort遇到非干净关闭(例如,由于接收但未处理 SIGINT ),串口的文件描述符如何受到影响? 在运行打开一个 QSerialPort 的应用程序之后在 /de
我有一个 flask 应用程序,我正在像这样运行: flask 运行 --host=0.0.0.0 当我查看进程列表时,我看到: UID PID PPID C STIME TTY
我是一名优秀的程序员,十分优秀!