1. 串口工作原理
串口(Serial Port)是一种通信接口,可用于实现计算机与外部设备的通信。串口工作原理如下:
数据传输:串口通过一组引脚,在两端设备之间进行数据传输。
数据编码:串口通常使用 RS-232 或 RS-485 等数据编码方式,对数据进行编码并传输。
数据格式: 串口通信使用的数据格式可能包括数据位, 停止位,校验位等,具体决定了数据的传输格式。
波特率:波特率是指串口每秒传输的数据位数,通常可以通过设置来调整串口的通信速度。
控制信号:串口还提供了一些控制信号,如请求发送(RTS)和数据准备就绪(DSR)等,用于控制通信的流程。通过以上原理,串口实现了计算机与外部设备的通信,可以用于实现各种应用,如设备控制,数据采集等。
2. 串口数据收发
2.1 命令行实现数据收发
1、设置终端:
查看串口:ls /dev/tty
设置串口参数:stty -F /dev/ttyS0 9600
2、读取数据:cat /dev/ttyS0
3、写入数据:echo "Hello world" > /dev/ttyS0
2.2 linux c实现数据收发
struct termios options;
tcgetattr(fd, &options);
options.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &options);
char send_buff[] = "Hello, World!\n";
int len = write(fd, send_buff, sizeof(send_buff));
if (len < 0) {
perror("Write Data Error!\n");
return -1;
}
char recv_buff[100];
len = read(fd, recv_buff, sizeof(recv_buff));
if (len < 0) {
perror("Read Data Error!\n");
return -1;
}
recv_buff[len] = '\0';
printf("Received Data: %s\n", recv_buff);
close(fd);
return 0;
}
2.3 golang实现数据收发
package main
import (
"bufio"
"fmt"
"github.com/tarm/serial"
"log"
"time"
)
func main() {
c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 115200}
s, err := serial.OpenPort(c)
if err != nil {
log.Fatal(err)
}
defer s.Close()
buf := make([]byte, 128)
n, err := s.Read(buf)
if err != nil {
log.Fatal(err)
}
fmt.Println(n, "bytes read:", string(buf[:n]))
n, err = s.Write([]byte("test"))
if err != nil {
log.Fatal(err)
}
fmt.Println(n, "bytes written")
// use bufio for improved performance
r := bufio.NewReader(s)
for {
n, err := r.Read(buf)
if err != nil {
log.Fatal(err)
}
fmt.Println(n, "bytes read:", string(buf[:n]))
time.Sleep(time.Second)
}
}