精华内容
下载资源
问答
  • Linux下查看串口是否可用的笨方法

    万次阅读 2017-01-12 19:33:03
    最近尝试将一个网关程序从 VxWorks 平台移植到 Linux 平台。在串口方面遇到了一些问题,这里记录一下。  首先在 VxWorks 下,用 devs 命令查看设备:-> devs drv name 0 /null 1 /tyCo/0 1 /tyCo/1 2 /...

      最近尝试将一个网关程序从 VxWorks 平台移植到 Linux 平台。在串口方面遇到了一些问题,这里记录一下。
      首先在 VxWorks 下,用 devs 命令查看设备:

    -> devs
    drv name
      0 /null
      1 /tyCo/0
      1 /tyCo/1
      2 /pcConsole/0
      2 /pcConsole/1
      9 host:
      4 /ram
     11 /vio
      4 /ahci01:1
    value = 0 = 0x0

      源程序中用到的串口就是 /tyCo/0 和 /tyCo/1,然后同事说 Linux 系统没有串口驱动,我想这怎么可能嘛!于是,在 Linux 下用 ls /dev/tty* 查看了一下,有好多呀。那么,如何确定哪个串口可用呢?
      我先用 dmesg | grep tty 看看系统启动过程中初始化了哪些串口设备,输出如下:

    [    0.000000] console [tty0] enabled
    [    1.478484] 00:0c ttyS2 at I/O 0x3e8 (irq = 5, base_baud = 115200) is a 16550A
    [    1.500255] 00:0d ttyS3 at I/O 0x2e8 (irq = 10, base_baud = 115200) is a 16550A

      tty0 是当前控制终端,执行命令 echo 123456 > /dev/tty0,发现会在当前终端下打印“123456”。同样,我们测试 echo 123456 > /dev/ttyS2echo 123456 > /dev/ttyS3,发现没有提示错误,而其他(例如:ttyS0)则会提示错误。
      另外我们可以用 cat /proc/tty/driver/serial 查看串口驱动信息,部分输出如下:

    serinfo:1.0 driver revision:
    0: uart:unknown port:000003F8 irq:4
    1: uart:unknown port:000002F8 irq:3
    2: uart:16550A port:000003E8 irq:5 tx:0 rx:0
    3: uart:16550A port:000002E8 irq:10 tx:0 rx:0
    4: uart:unknown port:00000000 irq:0
    5: uart:unknown port:00000000 irq:0
    6: uart:unknown port:00000000 irq:0
    ......
    31: uart:unknown port:00000000 irq:0

      显然,这里的信息与系统启动时打印的信息刚好对的上,16550A 是可编程串行接口芯片的型号。此外,通过 cat /proc/devicescat /proc/tty/driversls -l /dev/tty* 等命令,也可以看出一些有用信息。
      通过上面这些笨方法,基本上可以确定 VxWorks 系统的 /tyCo/0/tyCo/1 对于 Linux 系统的 /dev/ttyS2/dev/ttyS3。接下来就可以把相应的代码作修改进行验证了,或者进行串口编程来测试,例如:

    int fd;
    fd = open(“/dev/ttyS2”, O_RDWR);
    if(fd == -1)
    {
        perror(“串口1打开失败!”);
    }

    更详细的串口编程,可以参考:http://www.cnblogs.com/lovemo1314/archive/2010/10/29/1864327.html

    展开全文
  • C linux检测所有串口

    2021-05-14 18:06:51
    有没有一种很好的方法来检测Linux上串行端口上连接的所有连接设备?我在C编程,但其他例子也很受欢迎.你可以尝试打开每个端口,当它成功时,你将它添加到端口列表,但这似乎不是一个非常好的解决方案.您可以进入开发人员...

    有没有一种很好的方法来检测

    Linux上串行端口上连接的所有连接设备?我在C编程,但其他例子也很受欢迎.

    你可以尝试打开每个端口,当它成功时,你将它添加到端口列表,但这似乎不是一个非常好的解决方案.

    您可以进入开发人员,因为我的串口是USB端口,我可以检查哪些ttyUSB ..文件已经制作完成.但是这对非USB串行端口不起作用,因为tty0到tty63的文件总是在这个目录中.

    我的例子:

    std::string port;

    int fd

    std::vector<:string>> list;

    for(int i = 0; i < 256; ++i)

    {

    port.clear();

    port.append("/dev/ttyUSB");

    port.append(std::to_string(i));

    fd = open(port.c_str(), O_RDWR | O_NOCTTY | O_DELAY);

    if(fd != -1)

    {

    list.push_back(port);

    }

    }

    谢谢!

    展开全文
  • 随着互联网的迅猛发展,在使用计算机...利用基于TCP/IP的串口数据流传输的实现来控制管理设备,无需投资大量的人力、物力即可完成对传统设备的管理、更换或者升级。串口服务器的功能串口服务器是一种通信协议转换器...

    随着互联网的迅猛发展,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集和控制设备也在逐步地走向网络化,以便共享网络资源。所以,在电子设备日趋网络化的今天,利用串口服务器来实现网络通信具有十分重要的意义。利用基于TCP/IP的串口数据流传输的实现来控制管理设备,无需投资大量的人力、物力即可完成对传统设备的管理、更换或者升级。

    串口服务器的功能

    串口服务器是一种通信协议转换器,它设有两类通信端口:一类是标准的RS232/422/485格式的串行端口,远程的RTU(远程终端设备)监控模块通过串行控制总线接入串口服务器的此类端口;另一类是以太网口,通过网线将串口服务器接入局域网的交换机等设备中。

    串口服务器在工作中可自动将RS232/422/485格式的串行数据与基于TCP/IP协议的以太网数据包进行透明转换。一方面,串口服务器收到来自某一串行端口的现场数据,将其转换为TCP/IP格式的数据,通过以太网口进行网络上传;另一方面,串口服务器在局域网中捕获合法的数据协议包,通过解包来解析出有效的控制信息,通过监控机指定的串行端口将控制命令以串行数据的方式传送给远程RTU.

    硬件平台

    此系统的硬件平台如图1所示,它是以AT91RM9200芯片构建的Multibus-CPU开发板。MultiBus-CPU系统是基于AT91RM9200微控制器的智能化多总线测控系统,该系统可以建立基于Modbus-RTU总线协议的总线通信,使系统设备可以无缝地接入到基于Modbus-RTU模式的总线系统,以及可靠、实时并准确地完成工业现场的数据采集和信号输出等功能。系统支持Modbus-RTU协议,同时,系统还支持多种总线通信,包括RS485总线,工业以太网(UDP协议),串口RS232通信接口和USB通信接口。

    d6af169505405cc203f3d3f4ea165e2d.png

    图1:CPU模块原理图。

    软件平台

    本设计采用嵌入式Linux作为操作系统。ARM上的Linux的主要优势:可扩展的完整操作系统提供了可靠的多任务环境,基于开源模型(GPL),利用多种UNIX和开源应用程序以及用于基于ARM技术的多种设计(包括网络和无线领域)。

    Modbus协议

    Modbus协议是应用于电子控制器的一种通信语言。利用这个协议,控制器相互之间以及控制器通过网络(例如以太网)和其他设备之间进行通信。

    主流的Modbus协议为标准Modbus协议(Modbus RTU协议)和Modbus TCP协议。标准的Modbus通信协议定义了报文帧的每一字节,定义了怎样将数据打包成报文帧以及如何解码。报文帧包括一个字节的地址码,一个字节的功能码,数据和两个字节的校验码。其中,校验码采用CRC校验。

    Modbus TCP协议是在标准Modbus协议的基础上进一步发展而来的。它是将Modbus协议嵌入到底层TCP/IP协议中构成的,这样就在TCP/IP的以太网上实现了客户机-服务器架构的Modbus报文通信。二者的数据帧结构如图2所示。

    cdc0c11ff3fc49e02c68d65cc3237e12.png

    图2:标准Modbus与Modbus_TCP数据帧结构对比。

    分析Modbus TCP协议和RTU协议,可以非常清楚地看出两者的主要区别。与Modbus RTU协议相比,Modbus TCP数据帧里已不再有CRC校验,而这部分校验的任务是由TCP/IP协议和以太网的链路层来完成的。另外,Modbus TCP较标准的Modbus协议还加入了一个MBAP报文头,由它来解释说明Modbus的参数和功能。其他部分两者可以互相通用。如果TCP协议转换为RTU协议,那么,只需要把TCP协议MBAP头中的“单元标识域”和后续字节组成一帧,再加上此帧的CRC校验就可以组成RTU协议,而在串行链路上进行发送。如果是RTU协议转换到TCP协议的话,那么要根据实际情况组建一个MBAP头。

    获取配置信息GetConfigValue功能的设计与实现

    在设计串口服务器之前,首先要配置相应的设备号并给设备配置相应的串口服务器IP地址、TCP通信端口号和串口参数等,这些配置信息放在一个txt文件当中。

    我们设计了一个Configinfo。txt文件,当我们需要向一个设备传递信息时,需要首先从文件中读取配置信息,对相应的串口及工控板的网络进行配置,然后再进行相应的操作。这时,我们在其中用到了两个自定义函数:GetConfigValue和GetCFGValue.其中GetConfigValue的功能是将Configinfo。txt中的信息配置给串口服务器,它调用GetCFGValue函数,在Configinfo。txt中寻找相应的配置信息项,并截取相应的配置信息。它们的程序框图如图3(a)和3(b)所示。

    7df2c2953a12bd876eec254307482def.png

    图3:GetConfigValue函数程序流程图(a)和GetCFGValue函数程序流程图(b)。

    串口操作函数封装的设计与实现

    在对串口进行相应的操作时,首先要打开串口并配置串口的波特率、数据位、停止位和工作模式等。这些关于串口的操作都封装在一个文件当中,以使结构清晰,方便检查以及修改或增加更多的操作函数。所进行的包括以下几种操作。

    串口的打开和关闭:打开串口时,需要首先判断串口的类型,然后以一定的方式打开串口并保存原来的串口配置信息,最后对串口进行波特率、数据位、停止位和奇偶校验位的设置。关闭串口时,需要将原来保存的终端信息恢复,使串口回到打开前的状态。

    对串口进行数据读写:串口的读写操作是串口服务器最基本的功能,当有数据传送过来时,需要通过串口发送。写串口操作会把内存中的数据写入所指的文件,读串口操作会把串口送来的数据写入内存中。分别用writecomport和readcomport来实现。

    对串口进行设置:需要设置波特率、数据位、停止位和奇偶校验位。调用定义的封装函数,来完成这些操作。串口的工作模式通过termios函数的配置来控制。

    Modbus TCP/RTU相互转换功能的实现

    这一步是串口服务器设计的关键,其转换重点在于CRC校验和MBPA报头的变换。在这里,定义mod2tcp函数来完成Modbus RTU到TCP格式的转换,定义tcp2mod函数来完成Modbus TCP到RTU格式的数据转换。例如,来自Modbus主站的TCP协议请求,经串口服务器转换成Modbus RTU格式,经485口发送给从站,并将从站相应数据经485接口送入串口服务器,转换成Modbus TCP格式信息返回主站(图4)。

    4f53d174a744efb1c31fac2a29e991cd.png

    图4:Modbus TCP/RTU相互转换示例。

    程序流程如图5(a)和5(b)所示。

    4ff187a45a9ab6155fb380fe7d5e3909.png

    图5:Modbus RTU 到TCP格式数据转换程序流程(a)和Modbus TCP 到RTU格式数据转换程序流程(b)。

    由此可见,TCP格式字节数=RTU格式字节数-2+6,获取的可用数据均相同,因此其程序实现就不再是难题了。

    CRC校验功能

    CRC即循环冗余校验码,它是数据通信领域中最常用的一种差错校验码。RTU方式时,CRC校验传送的全部数据,它忽略信息中单个字符数据的奇偶校验方法。CRC校验的关键在于数据的匹配,将得到的数据如何正确的套用到CRC校验当中是其中的关键。

    CRC校验有既定的规则,其程序实现非常简单,只需要以下几步:CRC字节的初始化;将数据导入进行CRC计算;返回计算出的CRC值。

    串口服务器的设计与实现

    此部分介绍整个程序的main()函数,它会调用前文介绍的函数来实现串口服务器功能,故其头文件中要包含前文所述的各函数文件。程序流程如图6所示。

    main()函数应用Linux C函数编程,其中应尤其注意socket的应用,socket要先建立再bind();在信号量中的参数要配置正确;进程的管理方面,要注意进程退出时先退出子进程,在所有进程都完成之后再关闭socket.

    51591f76552c5a3f667d6b6e71d081a1.png

    图6:串口服务器main()函数程序流程图。

    问题及解决

    串口服务器测试过程中,有时会出现TCP到RTU发送时数据包错误,不能正确地将TCP数据转换为RTU数据。

    原因在于,测试过程中,Windows下的PC终端向Linux工控板发送数据,但是Windows的实时性并不很好,不能及时地发送数据,有时会出现一次发送两包数据给串口服务器的现象;另外,工控板中Linux下的TCP/IP协议剪裁封装不是很完善,导致其接收处理数据的能力比较差。

    当多帧数据同时到达时,串口服务器未能正确将后一帧数据发送出去,而把一帧数据分割到两帧,导致数据帧错误。这就是发生上述数据完全错误的原因。这时,需要给串口服务器添加数据的分帧处理功能,在接收到数据时,先判断数据帧是否是有效数据帧,确保每次发送的数据都能是完整的一帧,不会出现数据帧错位,而导致数据的完全错误。

    本文小结

    本文的目标是在以AT91RM9200芯片构建的Multibus-CPU开发板上实现串口服务器功能。该串口服务器应用Modbus相关协议,将传统的以RS485/232串口通信设备接入工业以太网,实现上位机和设备之间的信息交互。本串口服务器程序已经能够在开发板上正确运行。

    展开全文
  • 我以前曾经看过这个有usb到串口的适配器,但现在我也在原生串口上看到它,频率更高.系统设置为运行自动化测试,并且首先执行一些任务,这些任务会导致从串行设备输出大量数据,而我没有打开端口.该设备也将自行重置.仅...

    我有一个系统,我看到串行端口的奇怪行为,我不期望.我以前曾经看过这个有usb到串口的适配器,但现在我也在原生串口上看到它,频率更高.

    系统设置为运行自动化测试,并且首先执行一些任务,这些任务会导致从串行设备输出大量数据,而我没有打开端口.该设备也将自行重置.仅连接tx / rx线.没有流量控制.

    完成这些任务后,测试软件会打开串行端口并立即失败,因为它会收到意外响应.当我重现这一点时,我发现如果我在终端程序中打开串口,我会看到几千字节的旧数据(当端口关闭时似乎已经发送)立即刷新.关闭此程序后,我可以按预期运行测试.

    什么可能导致这种情况发生?当设备关闭时,Linux如何处理缓冲串口?如果我打开一个设备,让它发送输出,然后关闭它而不读取它,这会导致同样的问题吗?

    解决方法:

    即使没有打开,Linux终端驱动程序也会缓冲输入.这可能是一个有用的功能,特别是如果速度/奇偶校验/等.设置得当.

    要复制较小操作系统的行为,请在打开时立即从端口读取所有挂起的输入:

    ...

    int fd = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC);

    if (fd < 0)

    exit (1);

    set_blocking (fd, 0); // disable reads blocked when no input ready

    char buf [10000];

    int n;

    do {

    n = read (fd, buf, sizeof buf);

    } while (n > 0);

    set_blocking (fd, 1); // enable read blocking (if desired)

    ... // now there is no pending input

    void set_blocking (int fd, int should_block)

    {

    struct termios tty;

    memset (&tty, 0, sizeof tty);

    if (tcgetattr (fd, &tty) != 0)

    {

    error ("error %d getting term settings set_blocking", errno);

    return;

    }

    tty.c_cc[VMIN] = should_block ? 1 : 0;

    tty.c_cc[VTIME] = should_block ? 5 : 0; // 0.5 seconds read timeout

    if (tcsetattr (fd, TCSANOW, &tty) != 0)

    error ("error setting term %sblocking", should_block ? "" : "no");

    }

    标签:linux,serial-port,pyserial

    来源: https://codeday.me/bug/20190626/1293418.html

    展开全文
  • 区分Linux串口设备节点

    千次阅读 2015-04-21 17:08:16
    通常我们在linux下看到的控制台(console)是由几个设备完成的。分别是/dev/ttyN(其中tty0就是/dev /console,tty1,tty2就是不同的虚拟终端(virtual console)).通常使用热键alt+Fn来在这些虚拟终端之间进行切换...
  • Linux创建串口别名

    2020-03-10 22:17:21
    但是在Linux下,我们可以将对应的设备编写到rules文件,在我们插入新设备时候,就可以直接根据我们设置的串口名字找到对应设备,这可以应用到自启动的设备中,不会因为串口号不对应导致不必要的错误。小蝌蚪再也不用...
  • 一、核心数据结构串口驱动有3个核心数据结构,它们都定义在1、uart_driveruart_driver包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver)。...
  • Linux串口读写详解

    2019-12-14 16:54:31
    本文为《搭建物联网基础通信框架系列教程》的分支部分,读写Linux串口数据。 二、运行环境 Ubuntu16.04 三、串口相关的数据结构和函数 1、需要配置的结构体 struct termios { tcflag_t c_iflag; /* ...
  • 今天参照网上的例子用QT写了一个串口工具Demo,写完之后感觉没有明显的问题,然后就运行了Demo。结果发现扫描到的串口都打不开,即便是我把参照的代码尽数复制过来也还是打不开。于是我便想到会不会是权限的问题,...
  • 如何查看linux串口是否可用?串口名称等? http://zhidao.baidu.com/question/419148559.html 查看串口是否可用,可以对串口发送数据比如对com1口,echo lyjie126 > /dev/ttyS0 查看串口名称使用 ls -l /dev/ttyS*...
  • Linux串口编程

    万次阅读 多人点赞 2019-05-18 13:32:23
    一、串口通信介绍 串口是计算机上的串行通信的物理接口。首先先介绍一下串行通信,串行通信的分类: 1、按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输;就像路上的单行线。 半双工:允许...
  • Linux串口驱动程序(4)-数据发送Linux串口驱动程序(4)-数据发送1.tty数据发送调用关系怎么样才能找到发送数据所使用的函数呢?打开uart_register_driver函数,找到里面的tty_register_driver,转到定义,这里调用了...
  • 项目开发中,在安装linux系统的ARM9板上,需要实时检测USB口与Windows...串口通讯中断端口地址也不会消失,因此,只有通过在一定时间内检测端口的读写状态来判断串口通讯是够正常,如超时则认为连接断开。首先,打...
  • 本篇文章主要讲了与串口编程相关的几个知识点,以及在Linux上编写串口程序所要遵循的思想和要考虑的方面,以及它和我们之前在UC/OS操作系统上编写串口程序有什么区别。一.串口相关的几个基本概念可以结合《串口编程...
  • 串口通信流程图 下面我会一一介绍这几个步骤。 1.打开串口 代码(串口为ttyUSB0) //打开串口 int open_port(void) { int fd; //O_NONBLOCK设置为非阻塞模式,在read时不会阻塞住,在读的时候将read放在...
  • linux串口gps应用

    2021-05-13 20:16:36
    linux串口gps使用总结一、Gps数据格式标准(nmea0183)http://en.wikipedia.org/wiki/NMEA这次只要获取经纬度信息,所有主要针对下面2个Gps命令(1)位置信息(GGA)$GPGGA、<1>、<2>、<3>、<4>、...
  • 摘要: 基于现有的Linux普通方式传输的串口驱动,提出了通过利用DMA的高速串口驱动,根据传输时的实时数据量,利用DMA方式和普通方式相结合的方式进行数据传输,大大提高了传输速率,同时降低了系统的开销,减少了CPU...
  • Linux下的串口设置

    2021-05-13 03:09:27
    rs232是三芯通信,485是两芯通讯的,RS-232串口线 通常 是 DB9--DB9 的 串口通信线,9芯RS-485数据线 是 双绞线或者屏蔽双绞线,232传输距离较近,485传输距离比较远,485是单工(向)通讯,232是双工(向)的。...
  • linux串口操作函数

    2021-05-13 08:31:44
    1.打开串口:fd = open("/dev/ttyf1", O_RDWR | O_NOCTTY | O_NDELAY);fcntl(fd, F_SETFL, 0);O_NOCTTY 选项防止程序受键盘控制中止操作键等影响.O_NDELAY 告诉 UNIX 不必另一端端口是否启用.(检测 DCD信号线状态)2....
  • linux下的串口配置

    千次阅读 2019-06-25 21:06:44
    stty -F /dev/ttyUSB0 -a //查看/dev/ttyUSB0的串口配置 stty -F /dev/ttyUSB0 ispeed 115200 ospeed 115200 cs8 //配置/dev/ttyUSB0的输入输出波特率和数据位 /*************************************...
  • 上一篇博客是串口的打开及配置,博客链接...读串口串口就是接收串口数据,通过read来实现。read函数原型:#include &lt;unistd.h&gt; ssize_t read(int fd, void *buf, si...
  • 这里多说一句题外话:一直没有找到linux比较好的编辑工具,vim虽然功能强大,但是没有鼠标,总感觉不爽,gedit虽然有鼠标,但是缩进功能实在是不行,这里推荐一款本人一直用的,感觉用的不错,就是大家熟悉的eclipse...
  • linux基础操作3-串口收发

    千次阅读 2018-06-18 23:45:30
    而在 linux 串口编程中,无论是从 linux 官方直接下载的原生态内核,还是任何厂家提供的linux 内核,都会将串口驱动写好,所以对于所有的驱动工程师来说,是完全不需要自己动手写串口驱动的。串口的编程:1.初始化:...
  • linux 串口驱动 理解

    2021-05-13 12:51:51
    linux 串口 驱动 理解一、核心数据结构串口驱动有3个核心数据结构,它们都定义在1、uart_driveruart_driver包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动...
  • Linux下字符设备驱动

    2021-05-13 15:18:41
    linux操作系统驱动分类】字符设备: 串口,led,按键,一次只读取一个字节数据块设备: 一次读取多个字节(512字节), 硬盘,内存网络设备: 一次读取多字节数据本文引用地址:... 串口,Led,I2Cb开头的叫块设备文件 ...
  • 近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一;另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二。由于问题莫名其妙,以为是笔记本...
  • https://blog.csdn.net/specialshoot/article/details/50707965 linux串口通信主要有下面几个步骤   下面我会一一介绍这几个步骤。 1.打开串口 代码(串口为ttyUSB0) ...
  • 昨天应为要测试主板上的串口,查了一下,可以使用microcom 这条命令进行测试。命令使用方法很简单:Usage: microcom [-d DELAY] [-t TIMEOUT] [-s SPEED] [-X] TTY参数如下:-d 表示延时时间,一般我都不设置。-t ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,572
精华内容 3,828
关键字:

linux判断串口设备

linux 订阅