Articles of 串口

如果Device :: SerialPort上有数据,则用Perltesting

我写了一个从串口读取数据的Perl脚本。 use Device::SerialPort; $PortObj = new Device::SerialPort ($PortName, $quiet, $lockfile); $PortObj->read_const_time( 500 ); # timeout waiting for data after 500ms … 主循环尝试从串口读取数据: while ( 1 ) { ( $count, $data ) = $PortObj->read( $frameLength ); process_my_data( $data ); do_something_entirely_different_that_needs_being_done; } 但是,我不希望$ PortObj->读超时(耗费大量时间),而是希望能够testing缓冲区中的数据是否可用,以便加速循环: while ( 1 ) { if ( test_serial_data_available ) { ( $count, $data […]

COM端口拦截和修改Linux上的数据

我有一个收据打印机连接到我的COM端口,每当有人打印到我的收据打印机,我想添加一些额外的数据到COM端口的数据。 我在Linux上。 我怎样才能拦截出来的数据并进行修改,以便将额外的数据添加到收据打印中? 我基本上想写一个程序让我们叫它A,这是我的正常程序之间的作品,让我们打电话给B,打印收据和打印机通过连接到COM端口。 我不能修改程序B,这就是为什么我要通过编写程序A来拦截和修改数据。

通过RS485通讯

我有一个单板计算机通过RS485连接到另一个设备。 计算机应向设备发送请求并接收响应(使用设备相关协议)。 我可以发送消息没有任何问题,设备接收它们(例如,我可以更改设备的参数)。 当我想从设备读取参数时,就会出现问题。 在这种情况下,我收到错误的回应(错误的字符,转移的消息,不完整的消息,…)。 这是我的初始化代码: Bool SerialCommunicator::initPort() { if (isInitialized_) return true; if (!paramSet()) return false; bzero( &termIO_, sizeof ( struct termios )); termIO_.c_iflag |= IGNBRK | IGNPAR; termIO_.c_cflag |= CREAD | CLOCAL; termIO_.c_cflag |= CS8; termIO_.c_oflag |= 0; termIO_.c_lflag |= 0; termIO_.c_cc[VTIME] = 0; termIO_.c_cc[VMIN] = 13; // number of frame characters String […]

以asynchronous模式读取Linux串口

我在Linux系统中从串口读取数据时遇到了麻烦。 我正在尝试通过使用UART连接一个传感器与Linux系统。 我可以读写/ deve / ttyS1。 但问题是,我不想轮询来自UART的消息。 相反,我想使用asynchronous模式来获取数据。 随着数据的到来,callback函数将进入一个特定的例程并运行我的代码。 问题不在于传感器向我发送不同的数据包,而是每个数据包含各种字节的数据。 他们每一秒都来! 例如: Time Sensor MyLinux 1s 50bytes 124bytes 2s 40bytes 174bytes 3s 60bytes 244bytes 我的问题是如何使用asynchronous串行编程,以便在callback函数中,这两个数据包可以被读取为两个消息 说50个字节来了,回拨function可以让我读50个字节127个字节来,回拨function可以让我读127个字节 现在,它有50个字节,我只能读取27个字节,剩下的23个在下一个消息中。 我在POSIX中的串口设置是: /* now we setup the values in port's termios */ serial->tio.c_cflag=baudrate|databits|checkparity|stopbits|CLOCAL|CREAD; serial->tio.c_iflag=IGNPAR; serial->tio.c_oflag=0; serial->tio.c_lflag=0; serial->tio.c_cc[VMIN]=28; serial->tio.c_cc[VTIME]=6; /* we flush the port */ tcflush(serial->fd,TCOFLUSH); tcflush(serial->fd,TCIFLUSH); /* we send […]

Openwrt Linux设备列表

我想传输一些串行数据,如下所示:在openwrt路由器上的http://www.cse.dmu.ac.uk/~sexton/ENGD2003/openwrt/arduino%20teensy%20openwrt.html 。 但是,我直接连接到路由器的串口,而不是USB(在指南),所以现在我不知道以下哪个是设备: 以下哪一项是路由器的串口? bus mtd1 mtd5 null ttyATH0 ttyS15 ttyS9 console mtd1ro mtd5ro port ttyS0 ttyS2 urandom full mtd2 mtdblock0 ppp ttyS1 ttyS3 watchdog kmsg mtd2ro mtdblock1 ptmx ttyS10 ttyS4 zero log mtd3 mtdblock2 pts ttyS11 ttyS5 mem mtd3ro mtdblock3 random ttyS12 ttyS6 mtd0 mtd4 mtdblock4 shm ttyS13 ttyS7 mtd0r o mtd4ro mtdblock5 tty […]

如何在Linux中访问地址为0x2530c00的内存映射IO的UART寄存器?

我的主板有一个8250 UART,可以在内部环回模式下configuration。 我想testing这个UART,并想configuration它的内部回送。 这个UART是在0x2530c00地址MMIOed。 我可以通过Linux用户级别的代码吗? 或者我需要编写一个内核模块? 我需要使用什么函数来访问UART寄存器。 我的目标是将MCTRL寄存器中的LOOP位置1,并设置内部环回模式,并通过发送数据来testingUART。 请指导我 谢谢。

除非Arduino GUI串行监视器打开,否则不能回显到Arduino串行端口

我有一个很奇怪的问题。 我DCcduino Uno(Arduino Uno副本)通过USB串行接口插入我的Xubuntu盒子。 使用Arduino GUI串行监视器,我可以按照预期与电路板通信。 另外,当串行监视器打开,我可以ssh进入框,并运行命令,如echo 1700 > /dev/ttyUSB0完全正常。 但是,只要closures串行监视器(即使Arduino GUI仍在运行),该命令也不会再执行任何操作。 我已经尝试打开串行端口几个组合的stty参数,包括一切从 stty -F /dev/ttyUSB0 9600 cs8 cread clocal 至 stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts 但它不会写入到arduino。 我究竟做错了什么? 编辑: 我只是设法使用它 stty -F /dev/ttyUSB0 raw ispeed 9600 ospeed 9600 […]

串行(UART)caching溢出高速

我试图通过4Mbps的UART在Raspberry Pi(单向)与Raspbian之间传输数据。 我正在使用UART0( BCM2835外设第175页)。 我已经成功configuration了UART时钟源,所以我能够以如此高的速度进行发送/接收,而且的确可以工作。 我可以发送字节,并在另一边正确接收它们。 但是,如果我试图连续传输数据,则会丢失几个字节(〜2%),所以我想我正在接收缓冲区溢出(因为高达1Mbps,连续传输工作正常)。 据我所知,接收时有两个缓冲区,树莓派的UART0的硬件缓冲区是16字节,主存储器上是软件缓冲区。 内核将数据从硬件缓冲区移动到软件缓冲区,我的应用程序从那里获取数据。 有什么办法可以知道哪两个缓冲区溢出了? 如果是这样,怎么样? 谢谢!

串口在启动时没有响应

我正在使用以下function打开串行端口 int open_port (unsigned char * port) { int fd = open(port,O_RDWR | O_NOCTTY | O_NDELAY); if(fd == -1) { return PORT_ERR; } else { struct termios new_termios; struct termios orig_termios; tcgetattr(0, &orig_termios); memcpy(&new_termios, &orig_termios, sizeof(new_termios)); cfmakeraw(&new_termios); cfsetispeed(&new_termios,B9600); cfsetospeed(&new_termios,B9600); tcsetattr(fd, TCSANOW, &new_termios); return fd; } } 我正在使用Debian(raspberrypi)发行版运行Cubieboard2上的程序。 当我手动运行程序,它工作正常。 但是当程序在init.d脚本启动的时候启动,它运行正常,可以很好的执行其他任务(读写文件),但是不会读取串口发送的任何数据。 lsof /dev/ttyUSB1 还显示该端口正在被我的程序使用。 有任何想法吗?

Linux串行默认shell的IP隧道

这是这个问题的一个更受限制的版本: 我有一个embedded式ARM设备,运行一个Linux 3.10.0内核的自定义映像。 唯一的物理接口(不,USB,无以太网)是连接其中一个串行接口的默认Linuxshell。 我的问题是:是否有任何内置或外部工具,通过此连接打开IP隧道? 我看到一些一般问题: 该设备已被Linux使用,因此必须使用stdin / out来进行通信,而不是直接访问设备。 启动隧道应用程序后,应用程序必须等待隧道客户端连接,因为我需要closures计算机上的串行连接,然后启动隧道客户端。 应该有一种方法来closures连接并返回到正常的shell 实际的要求是,我可以通过串口线连接到embedded式设备的计算机上访问embedded式设备上运行的REST接口。 这已经在具有物理以太网或USB以太网的设备上工作,但是该设备不提供这个function。 [更新]正如所解释的,socat目前在我们的embedded式设备上不可用,所以第一次尝试时,我使用了以下内容: 具有物理串行接口的Linux(Ubuntu)笔记本电脑 具有物理串行接口和cygwin + socat的Windows笔记本电脑 两者都通过零调制解调器电缆连接 注意:我使用的是Windows笔记本电脑,因为我们将会在Linux上运行socat客户端(不幸的是)。 直接连接STDIO 服务器 socat stdio file:/dev/ttyS0,b115200 客户 socat file:/dev/ttyS4,b115200 stdio 在cygwin中, ttyS0是COM1 ,本例中的ttyS4是COM5 。 使用这些,socat就像一个小聊天程序。 为什么我在一边input是在另一边输出,反之亦然。 TCP连接 下一步是使用TCP连接。 服务器 socat /dev/ttyS0,b115200,crtscts=1,raw,echo=0 tcp-connect:localhost:80 客户 socat -T2 file:/dev/ttyS4,b115200,crtscts=1,raw,echo=0 tcp-l:7777,reuseaddr 我使用硬件stream控制指定了波特率(115200),使用原始传输,没有回应(HTTP请求否则会被发送回请求者)。 脓,我不得不使用超时-T2到2秒后终止连接。 否则,curl不会终止,并等待更多的数据。 当我在windows计算机上使用curl时,它通过串行连接成功传输请求,并在Linux计算机上返回HTTP服务器的完整HTTP响应: curl localhost:7777/index.html 但是,它只能使用一次。 请求完成后, socat客户端和服务器终止。 […]