Linux下串口收发通信

Linux下编程的过程有些固定,很多都是比如打开、配置、关闭等等

串口通信流程:打开串口ttySn--->初始化串口--->读写(read、write)--->关闭串口

最合适的指导书:https://www.ibm.com/developerworks/cn/linux/l-serials/

 

串口设置

       最基本的设置串口包括波特率设置,效验位和停止位设置。

       串口的设置主要是设置 struct termios 结构体的各成员值。

struct termio
{   unsigned short  c_iflag;        /* 输入模式标志 */    
    unsigned short  c_oflag;        /* 输出模式标志 */    
    unsigned short  c_cflag;        /* 控制模式标志*/
    unsigned short  c_lflag;        /* local mode flags */  
    unsigned char   c_line;         /* line discipline */   
    unsigned char   c_cc[NCC];      /* control characters */
};

串口控制函数

tcgetattr      取属性(termios结构)
tcsetattr      设置属性(termios结构)
cfgetispeed    得到输入速度
cfgetospeed    得到输出速度
cfsetispeed    设置输入速度
cfsetospeed    设置输出速度
tcdrain        等待所有输出都被传输
tcflow         挂起传输或接收
tcflush        刷清未决输入和/或输出
tcsendbreak    送BREAK字符
tcgetpgrp      得到前台进程组ID
tcsetpgrp      设置前台进程组ID

 

以下代码通过测试

串口.h文件   usart.h

/*********************************************************************************
 *      Copyright:  (C) 2018 Yujie
 *                  All rights reserved.
 *
 *       Filename:  usart.h
 *    Description:  串口配置
 *                 
 *        Version:  1.0.0(08/27/2018)
 *         Author:  yanhuan <yanhuanmini@foxmail.com>
 *      ChangeLog:  1, Release initial version on "08/23/2018 17:28:51 PM"
 *                 
 ********************************************************************************/

#ifndef  _USART_H
#define  _USART_H

//串口相关的头文件    
#include<stdio.h>      /*标准输入输出定义*/    
#include<stdlib.h>     /*标准函数库定义*/    
#include<unistd.h>     /*Unix 标准函数定义*/    
#include<sys/types.h>     
#include<sys/stat.h>       
#include<fcntl.h>      /*文件控制定义*/    
#include<termios.h>    /*PPSIX 终端控制定义*/    
#include<errno.h>      /*错误号定义*/    
#include<string.h>    
     
     
//宏定义    
#define FALSE  -1    
#define TRUE   0
int UART0_Open(int fd,char*port);
void UART0_Close(int fd) ; 
int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity);
int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity) ;
int UART0_Recv(int fd, char *rcv_buf,int data_len);
int UART0_Send(int fd, char *send_buf,int data_len);

#endif

串口.c文件    usart.c

/*********************************************************************************
 *      Copyright:  (C) 2018 Yujie
 *                  All rights reserved.
 *
 *       Filename:  usart.c
 *    Description:  串口配置
 *                 
 *        Version:  1.0.0(08/27/2018)
 *         Author:  yanhuan <yanhuanmini@foxmail.com>
 *      ChangeLog:  1, Release initial version on "08/23/2018 17:28:51 PM"
 * 
Linux 下进行串口通信时,可以使用 POSIX 标准库提供的 termios 库来进行串口的配置和操作。 在进行串口通信时,通常会使用阻塞式 I/O 操作。即,当调用串口读取函数时,如果串口缓冲区中没有数据,函数会一直阻塞直到有数据到来或者超时。同样,当调用串口写入函数时,如果串口缓冲区已满,函数也会一直阻塞直到缓冲区有空间可以写入数据。 下面是一个使用阻塞式 I/O 进行串口通信的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main(void) { int fd; struct termios options; // 打开串口设备文件,以读写方式打开 fd = open("/dev/ttyS0", O_RDWR); if (fd < 0) { perror("open"); exit(1); } // 获取并修改串口配置 tcgetattr(fd, &options); cfmakeraw(&options); cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); tcsetattr(fd, TCSANOW, &options); // 循环读写数据 while (1) { char buf[100]; int len; // 读取串口数据 len = read(fd, buf, sizeof(buf)); if (len < 0) { perror("read"); exit(1); } printf("Received: %.*s\n", len, buf); // 发送串口数据 strcpy(buf, "Hello, world!\n"); len = write(fd, buf, strlen(buf)); if (len < 0) { perror("write"); exit(1); } printf("Sent: %.*s\n", len, buf); sleep(1); } // 关闭串口设备文件 close(fd); return 0; } ``` 在上面的代码中,我们使用阻塞式 I/O 进行串口通信。在循环中,我们先读取串口数据,然后发送一些数据。注意,在读取或写入数据时,我们使用了阻塞式 I/O 函数 read 和 write,它们会一直阻塞直到有数据到来或者缓冲区有空间可以写入数据。此外,我们在发送数据时,使用了 sleep 函数来进行延时,以便让数据能够被接收方处理。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值