1. 串口工作原理
串口(Serial Port)是一种通信接口,可用于实现计算机与外部设备的通信。串口工作原理如下:
数据传输:串口通过一组引脚,在两端设备之间进行数据传输。 数据编码:串口通常使用 RS-232 或 RS-485 等数据编码方式,对数据进行编码并传输。数据格式: 串口通信使用的数据格式可能包括数据位, 停止位,校验位等,具体决定了数据的传输格式。 波特率:波特率是指串口每秒传输的数据位数,通常可以通过设置来调整串口的通信速度。 控制信号:串口还提供了一些控制信号,如请求发送(RTS)和数据准备就绪(DSR)等,用于控制通信的流程。通过以上原理,串口实现了计算机与外部设备的通信,可以用于实现各种应用,如设备控制,数据采集等。
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) } }