Linux下串口与工业协议的开发

1、串口通信原理

串口通信定义

串口通信:数据的串行传送方式。串口通信可分为同步通信异步通信

同步通信:按照软件识别同步字符来实现数据的发送和接收。

  • 将许多字符组成一个信息组进行发送
  • 要求发送时钟和接收时钟保持严格的同步
  • 效率相对高,对双发时钟的误差要求也高

   

异步通信:利用字符的再同步技术的通信方式。

  • 按字符一个一个进行传输
  • 每传输一个字符,就用起始位来通知对方,以此来重新核对收发双方同步
  • 可靠性较高,但效率较低

  

  同步通信按帧为单位传输,异步通信按字符为单位传输。(数据链路层)

9针串口管脚布局

  

串口通信重要参数:

波特率、数据位、停止位、奇偶校验

串口通信的测试:

连接com1和com2两个串口,在/dev/ttyS0设备文件中写入数据“Hello”,然后看/dev/ttyS1设备文件。串口设备可以使用read/write直接访问。

ttyS0对应com1,ttyS1对应com2。

2、串口编程常用的API

串口参数设置

串口编程需要用到的头文件

1 #include <stdio.h>        /*标准输入输出*/
2 #include <stdlib.h>       /*标准函数库*/
3 #include <unistd.h>      /*Unix标准函数定义*/
4 #include <sys/types.h>  /*定义数据类型*/
5 #include <sys/stat.h>    /*定义状态相关的数据类型*/
6 #include <fcntl.h>         /*文件控制定义*/
7 #include <termios.h>    /*POSIX终端控制定义*/
8 #include <errno.h>       /*错误号定义*/
9 #include <string.h>      /*字符串功能函数*/

波特率的设置

cfsetispeed() 设置输入端口的波特率

cfsetospeed() 设置输出端口的波特率

cfgetispeed() 获取输入端口的波特率

cfgetospeed() 获取输出端口的波特率

struct termios opt; 定义指向termios结构的指针opt

termios结构体

#define NCCS 19
struct termios{
    tcflag_t c_iflag;     //输入参数
    tcflag_t c_oflag;    //输出参数
    tcflag_t c_cflag;    //控制参数
    tcflag_t c_ispeed;  //输入波特率
    tcflag_t c_ospeed; //输出波特率
    cc_t c_line;           //线控制
    cc_t c_cc[NCCS];  //控制字符
};

波特率设置实例

cfsetispeed(&opt, B9600); //指定输入波特率为9600bps
cfsetospeed(&opt, B9600); 

串口常见操作

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

int read(int fd, *buffer, length);

int write(int fd, *buffer, length);

int close(int fd);

串口控制流程

  • 设置波特率
  • 校验位和停止位的设置
  • 打开串口
  • 发送串口数据
  • 读取串口数据
  • 关闭串口

3、串口编程实践

4、Modbus协议介绍

属于应用层协议,用于电子控制器进行控制和通讯的通讯协议。通过此程序,控制器相互之间、控制器经由网络和器它设备之间可以进行通信。

ModBus的两种常用传输模式:

ASCLL模式:在消息中的每个8Bit字节都作为两个ASCLL字符发送,字符发送的时间间隔可达到1秒而不产生错误。

RTU模式:在同样的波特率下,可比ASCLL方式传送更多的数据。(更为常用一些)

两种模式的比较

功能代码位

例:ModBus一个实例

  发送指令: 01 04 00 28 00 02 F1 C3 

 <slave address 1 Byte><Function 1 Byte><Start Address 2 Bytes><NumberofBytes 2 Bytes><Checksum 2 Bytes>

  接收回复: 01 04 04 42 0B 99 9A 74 05

   <slave address 1 Byte><Function 1 Byte><NumberofBytes 1 Bytes><DataIEEE32 x Byte><Checksum 2 Bytes>

ModBus通信协议的通信方式

5、Modbus编程实践

原文地址:https://www.cnblogs.com/kwseeker-bolgs/p/4430182.html