Articles of 串口

如何在Linux上正确设置串行通信

我试图读写FPGA板上的数据。 电路板本身带有一个驱动程序,在电路板插入时创build一个名为ttyUSB0的terminal设备。在FPGA上实现了一个asynchronous接收器和发送器,它们似乎工作正常。 但是,在C方面似乎存在一个问题。 我一直在使用一些testing向量来testingFPGA是否输出正确的信息。 我发现了一些事情: 设备有时无法正确打开 terminal属性有时无法被检索或设置。 读取有时是非阻塞的,不会检索正确的值。 以下是我如何设置terminal和文件描述符选项。 其中很多是从这里采取: http : //slackware.osuosl.org/slackware-3.3/docs/mini/Serial-Port-Programming 对于为什么程序可能失败的任何build议或意见将是非常有帮助的。 #include <stdio.h> // Standard input/output definitions #include <string.h> // String function definitions #include <unistd.h> // UNIX standard function definitions #include <fcntl.h> // File control definitions #include <errno.h> // Error number definitions #include <termios.h> // POSIX terminal control definitions int open_port(void){ int […]

如何在Linux中高效地等待RS232的CTS或DSR?

目前,我正在通过以下方式读取串口的CTS和DSR信号: bool get_cts(int fd) { int s; ioctl(fd, TIOCMGET, &s); return (s & TIOCM_CTS) != 0; } 现在我想等到get_cts()返回true。 一个简单的循环不是我认为的最好的解决scheme(因为它是非常耗费资源的)。 void wait_cts(int fd) { while(1) { if(get_cts(fd)) { return; } } } 在Linux上使用C或C ++有没有更好的解决scheme? (我不能使用任何硬件stream量控制,因为我根本不需要串行数据线。)

Linux串口读取 – 我可以改变input缓冲区的大小吗?

我正在用Ubuntu C ++编写一个应用程序来从串口读取数据。 它通过调用select()然后ioctl(fd,FIONREAD,&bytes_avail)代码来成功地工作ioctl(fd,FIONREAD,&bytes_avail)在使用read()最终获取数据之前找出有多less字节可用。 我的问题是这样的:每次select返回的数据,可用字节数报告为8.我猜这是一个缓冲区大小设置的地方,并select返回通知给用户,当这个缓冲区已满。 作为一名开发人员,我是Linux的新手(但并不是C ++的新手),我试图研究(没有成功)是否可以改变这个缓冲区的大小,或者甚至假设我的假设是真的。 在我的应用程序中,时序非常关键,每当读取缓冲区中有新字节时,我都需要收到警报。 这是可能的,没有深入研究内核代码?

在C ++ linux中将STRING写入串口

我知道这个问题遍布在互联网上,但是,还没有什么东西让我完全在那里。 我想在C ++(linux)中将数据写入到一个串行端口,以用于Propeller板。 当从控制台进行input时,程序工作正常,但是当我向其写入string时总是返回: ERROR – Invalid command来自设备的ERROR – Invalid command 。 我试图创build与hex值的char数组,然后它的工作。 下面是一个工作代码。 但是,我将如何才能够提供一个stringvariables的命令,并将其发送到串行端口? 也许,如果它是唯一的方法,我如何将它转换为hex值? 感谢大家 注意:循环是使用控制台的用户input。 我需要的是一种将串variables发送到串口的方法。 #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main(int argc,char** argv){ struct termios tio; struct termios stdio; int tty_fd; fd_set rdset; unsigned char c='D'; printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]); […]

如何在linux中打开串口而不更改任何引脚?

Posix要求在端口打开时更改RTS引脚。 我想要一个方法来避免它。

通过串口读写二进制数据

所以我search了一下,也找不到我需要的东西。 我需要帮助通过串口读取和写入二进制数据,并希望您可能有任何build议。 请注意,当我处于这个项目的另一个阶段时,我问了一个类似于这个问题的问题。 以下是程序。 第一个程序打开一个文件“test.jpg”,以二进制模式读取并将结果存储在缓冲区中。 然后closures文件,并且应该通过串口发送该文件。 第二个程序创build一个名为“testout.jpg”的文件,并且应该读取从前一个程序发送的数据。 我有一个预感,我的代码中的问题在于第二个程序。 也许我也需要用fread呢? 我尝试了,但我不知道如何实现一个串口,因为我是相对较新的编程。 非常感谢您的时间。 串行写入: #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions […]

通过串行连接的双向C ++通信

我正在尝试编写一个非常简单的C ++应用程序来与Arduino进行通信。 我想发送Arduino一个它立即发回的字符。 我从教程中获得的Arduino代码如下所示: void setup() { Serial.begin(9600); } void loop() { //Have the Arduino wait to receive input while (Serial.available()==0); //Read the input char val = Serial.read(); //Echo Serial.println(val); } 我可以很容易地使用GNU屏幕与Arduino进行通信,所以我知道一切正常工作与基本沟通: $ screen /dev/tty.usbmodem641 9600 我有(破碎的)C ++代码看起来像这样: #include <fstream> #include <iostream> int main() { std::cout << "Opening fstream" << std::endl; std::fstream file("/dev/tty.usbmodem641"); std::cout << […]

打开设备时Linux串口缓冲区不为空

我有一个系统,我看到奇怪的行为与我不期望的串行端口。 我以前曾经见过这种与USB串口适配器,但现在我也看到它在本地串行端口以及更大的频率。 系统设置为运行自动化testing,并首先执行一些任务,导致大量的数据从串行设备输出,而我没有打开端口。 该设备也将自行重置。 只有tx / rx线路连接。 没有stream量控制。 完成这些任务后,testing件打开串口并立即失败,因为它会得到意外的响应。 当我重现这一点时,我发现如果我在terminal程序中打开串口,我看到几千字节的旧数据(在端口closures时显示已经发送)立即被刷新。 一旦我closures了这个程序,我就可以按照预期运行testing了。 什么可能导致这种情况发生? 当设备closures时,Linux如何处理缓冲串行端口? 如果我打开一个设备,使它发送输出,然后closures它没有读取它,这会导致同样的问题?

如何检测缓冲区溢出在Linux上使用c + +的串行端口上运行

我有一个很大的问题。 目前我正在通过以下钩子访问串行端口: fd = open( "/dev/ttyS1", O_RDWR | O_NOCTTY ) 然后我使用下面的代码块读取它 i = select( fd + 1, &rfds, NULL, NULL, &tv ) … iLen = read( fd, buf, MAX_PACKET_LEN ) 问题是,在我读之前,我需要检测是否有任何缓冲区溢出。 在串口级别和内部tty翻转缓冲区。 我们尝试了cat /proc/tty/driver/serial但似乎并没有列出溢出(见下面的输出) 1: uart:16550A port:000002F8 irq:3 tx:70774 rx:862484 fe:44443 pe:270023 brk:30301 RTS|CTS|DTR

如何在gnu屏幕中切换CR / LF?

我正在使用屏幕从串行控制台读取文本。 问题是输出似乎只有换行\ n但不回车\ r,所以显示看起来像这样… Line1 Line2 Line3 我想知道是否有补丁来解决这个问题?