串口是一种常见的计算机接口,用于设备之间的数据传输和通信。随着usb设备的发展,串口这一设备其传输效率和稳定性方面的缺点已经被逐渐淘汰掉,但由于串口设备传统、结构简单、成本低的特点,对于特殊领域和设备,仍有其使用价值,因此本文将简单介绍下串口的概念,已经相关基础函数。
第一部分:串口相关概念
- 串口的定义和作用:串口是一对数据线(发送线和接收线)组成的接口,用于计算机与外部设备之间的数据交换。它可以连接各种设备,如打印机、传感器等,实现数据的收发和通信;
- 串口的硬件结构:串口由发送器和接收器组成。发送器将计算机的数据转换为电信号发送出去,接收器将接收到的电信号转换为计算机可读的数据;
- 通信协议:包括RS-232、RS-422和RS-485等;
- 接口:标准的DB-9或DB-25;
- 常用串口设备:串口打印机(多见于小票打印机)、GPS接收器、传感器等低速通信和较老的设备;
第二部分:串口协议参数
- 串口通信协议:串口通信需要使用一种协议规定数据的传输格式和通信规则。常见的协议有ASCII码和Modbus等。开发串口功能时需要了解所使用的协议,并按照协议规定进行数据的解析和处理。
- 串口通信参数:串口通信需要设置一些参数,例如波特率、数据位、停止位和校验位等。这些参数用于控制数据传输的速度和稳定性。具体的解释:
波特率:每秒钟传输的比特数(bits per second),常见值为9600,14400,115200bps等。
数据位:传输一个字符时,该字符有效数据部分的比特数。
停止位:标志着传输一个串口字符的结束,可以是1位、2位
校验位:可以作奇校验,偶校验,1校验,0校验,无校验。
默认配置:波特率9600、数据位8位、停止位1位、无校验
3.在串口通信中,RX(接收)和TX(发送)是串口的两个重要接口,用于数据的接收和发送。串口通信的基本原理是通过RX和TX接口在计算机和外部设备之间进行数据传输。数据发送时,计算机将数据发送到串口的发送线(TX线),外部设备通过串口的接收线(RX线)接收数据。数据接收时,外部设备将数据发送到串口的发送线(TX线),计算机通过串口的接收线(RX线)接收数据
第三部分:串口功能开发
编程接口:不同的操作系统和编程语言提供了各种串口编程接口,如Windows的WinAPI、Linux的termios库、Python的pySerial等。
开发者需要选择适合自己平台和语言的编程接口,并熟悉其使用方法。
关于串口开发主要包括:
- 串口数据收发,包括打开串口、设置通信参数、发送数据和接收数据等步骤。
- 数据解析与处理,包括解析接收到的数据,数据校验、数据转换和数据存储等操作,确保数据的准确性和可用性。
- 错误处理与调试,确保串口功能的稳定性和可靠性。
第四部分:串口开发常用函数
4.1 windows
在Windows系统中进行串口开发时,可以使用以下常用的API来实现串口通信:
1. CreateFile: 用于打开串口设备的函数,返回一个文件句柄,用于后续的读写操作。
```c
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
```
2. SetCommState: 用于设置串口的通信参数,如波特率、数据位、停止位和校验位等。
```c
BOOL SetCommState(
HANDLE hFile,
LPDCB lpDCB
);
```
3. SetCommTimeouts: 用于设置串口的超时参数,包括读取和写入操作的超时时间。
```c
BOOL SetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
);
```
4. ReadFile: 用于从串口读取数据。
```c
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
```
5. WriteFile: 用于向串口写入数据。
```c
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
```
6. CloseHandle: 用于关闭串口设备的文件句柄。
```c
BOOL CloseHandle(
HANDLE hObject
);
```
4.2 Linux
在Linux系统上进行串口开发时,可以使用以下常用的API来实现串口通信:
1. open: 用于打开串口设备文件,返回一个文件描述符,用于后续的读写操作。
```c
int open(const char *pathname, int flags);
```
2. ioctl: 用于设置串口的通信参数和控制操作,如波特率、数据位、停止位、校验位、流控制等。
```c
int ioctl(int fd, unsigned long request, ...);
```
3. read: 用于从串口读取数据。
```c
ssize_t read(int fd, void *buf, size_t count);
```
4. write: 用于向串口写入数据。
```c
ssize_t write(int fd, const void *buf, size_t count);
```
5. close: 用于关闭串口设备的文件描述符。
```c
int close(int fd);
```
6. tcgetattr和tcsetattr: 用于获取和设置串口的终端属性,包括波特率、数据位、停止位、校验位等。
```c
int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
```
4.3 跨平台函数
关于串口开发相关的跨平台第三方库,目前网络上存在很多。其中比较常见的是libserialport库,可以自行搜索获取更多信息;
libserialport is a minimal, cross-platform shared library written in C that is intended to take care of the OS-specific details when writing software that uses serial ports.
It is licensed under the terms of the GNU Lesser General Public License, version 3 or later.
Supported operating systems: