树莓派 Linux 下的串口通讯 (C语言)

2023-05-16

运行环境:Ubuntu14.04、树莓派3B+

功能:实现串口数据的收发

main.c文件

#include "com.h" 

#define BUFFER_SIZE 30      /*最大缓存区*/

char *pstr[]={"NO1\n","NO2\n","NO3\n","NO4\n"}; 
int main(int argc, char *argv[])
{
	int fd;
	int i;
	char read_buffer[BUFFER_SIZE];
	int read_buffer_size;

	//打开串口
	fd = open_port(0);
	//设置串口
    if(set_com_config(fd, 115200, 8, 'N', 1) < 0) /* 配置串口 */ 
    { 
        perror("set_com_config"); 
        return 1; 
    } 

	//发送数据
	do{
		for(i = 0; i < 4; i++)
		{
			write(fd, pstr[i], strlen(pstr[i]));
			sleep(1);
			do{
				memset(read_buffer,0, BUFFER_SIZE);
				read_buffer_size = read(fd, read_buffer, BUFFER_SIZE);				
			}while(!read_buffer_size);
			printf("read[%d][%s]\n",  read_buffer_size,read_buffer);
		}
	}while(1);
	close(fd);
	return 0;
}

com.c文件

#include "com.h"
/*
struct termios
{
    unsigned short c_iflag;   //输入模式标志
    unsigned short c_oflag;   //输出模式标志-
    unsigned short c_cflag;   //控制模式标志
    unsigned short c_lflag;   //本地模式标志-
    unsigned char c_line;     //线路规程-
    unsigned char c_cc[NCC];  //控制特性
    speed_t c_ispeed;         //输入速度-
    speed_t c_ospeed;         //输出速度-
}
*/

/****************************************/
/************打开串口函数****************/ 
/****************************************/
int open_port(int com_port) 
{
    int fd; 
    /* 使用普通串口 */ 
    //char *dev[] = {"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2","/dev/ttySAC3"};  
    /* 使用 USB 转串口 */ 
    char *dev[] = {"/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2"}; 

    printf("open dev [%s]\n",dev[com_port]);
    //O_NDELAY 同 O_NONBLOCK。
    fd = open(dev[com_port], O_RDWR|O_NOCTTY); 
    if (fd < 0) 
    { 
        perror("open serial port"); 
        return(-1); 
    } 

    //恢复串口为阻塞状态 
    //非阻塞:fcntl(fd,F_SETFL,FNDELAY)  
    //阻塞:fcntl(fd,F_SETFL,0) 
    if (fcntl(fd, F_SETFL, 0) < 0) 
    { 
        perror("fcntl F_SETFL\n"); 
    } 
    /*测试是否为终端设备*/ 
    if (isatty(STDIN_FILENO) == 0) 
    { 
        perror("standard input is not a terminal device"); 
    } 

    return fd; 
} 

/***********************************/
/************串口配置***************/
/***********************************/
int set_com_config(int fd,int baud_rate,int data_bits, char parity, int stop_bits) 
{ 
    struct termios opt;
    int speed;
    if(tcgetattr(fd, &opt) != 0)  
    { 
        perror("tcgetattr"); 
        return -1; 
    }
   
    /* 设置字符大小*/ 
    //opt = opt;
    //cfmakeraw(&opt);//配置为原始模式
    //opt.c_cflag &= ~CSIZE;//c_cflag 控制模式标志

    /*设置波特率*/ 
    switch (baud_rate) 
    { 
        case 2400:  speed = B2400;  break; 
        case 4800:  speed = B4800;  break; 
        case 9600:  speed = B9600;  break; 
        case 19200: speed = B19200; break; 
        case 38400: speed = B38400; break;
        default:    speed = B115200;break;   
    } 
    cfsetispeed(&opt, speed); 
    cfsetospeed(&opt, speed); 
    tcsetattr(fd,TCSANOW,&opt);

    opt.c_cflag &= ~CSIZE;

    /*设置数据位*/ 
    switch (data_bits) 
    { 
        case 7: {opt.c_cflag |= CS7;}break;//7个数据位  
        default:{opt.c_cflag |= CS8;}break;//8个数据位 
    } 
      
    /*设置奇偶校验位*/ 
    switch (parity) //N
    {   
        case 'n':case 'N': 
        { 
            opt.c_cflag &= ~PARENB;//校验位使能     
            opt.c_iflag &= ~INPCK; //奇偶校验使能  
        }break;
        case 'o':case 'O': 
        { 
            opt.c_cflag |= (PARODD | PARENB);//PARODD使用奇校验而不使用偶校验 
            opt.c_iflag |= INPCK;
        }break; 
        case 'e':case 'E': 
        { 
            opt.c_cflag |= PARENB;   
            opt.c_cflag &= ~PARODD;  
            opt.c_iflag |= INPCK;    
        }break; 
        case 's':case 'S': /*as no parity*/  
        { 
        	opt.c_cflag &= ~PARENB; 
        	opt.c_cflag &= ~CSTOPB; 
        }break;
        default:
        {
            opt.c_cflag &= ~PARENB;//校验位使能     
            opt.c_iflag &= ~INPCK; //奇偶校验使能          	
        }break; 
     }
           
     /*设置停止位*/ 
     switch (stop_bits)
     { 
        case 1: {opt.c_cflag &=  ~CSTOPB;} break;
        case 2: {opt.c_cflag |= CSTOPB;}   break;
        default:{opt.c_cflag &=  ~CSTOPB;} break; 
     } 
      
    /*处理未接收字符*/ 
    tcflush(fd, TCIFLUSH); 

    /*设置等待时间和最小接收字符*/ 
    opt.c_cc[VTIME]  = 11; 
    opt.c_cc[VMIN] = 0; 
      
    /*关闭串口回显*/
    opt.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|NOFLSH); 

    /*激活新配置*/ 
    if((tcsetattr(fd, TCSANOW, &opt)) != 0) 
    { 
        perror("tcsetattr"); 
        return -1; 
    }      
    return 0; 
}

com.h文件

#ifndef _COM_H_
#define _COM_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

int set_com_config(int fd,int baud_rate,int data_bits, char parity, int stop_bits);
int open_port(int com_port);

#endif

在树莓派3B+中的编译结果和运行结果如下:

通过上位机发送一个字符串“test string”,树莓派会按顺序返回一个字符串"NO1"~"NO4"。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派 Linux 下的串口通讯 (C语言) 的相关文章

  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • 1695_week2_算法与函数(MIT使用Python编程学习手记)

    全部学习汇总 xff1a GreyZhang python basic My learning notes about python github com 首先说明一下 xff0c 这部分信息的整理只是我个人的理解 由于自己的知识功底以及英
  • 1696_C语言中变量默认初始化初值探究测试

    全部学习汇总 xff1a GreyZhang c basic little bits of c github com 欢迎路过的YUAN类朋友相互沟通交流 xff0c 也欢迎各位随时指点指正 以下是我的联系方式 xff1a 微信 xff1a
  • 1697_python编程_assertions and exceptions

    全部学习汇总 xff1a GreyZhang python basic My learning notes about python github com 这部分主要关于程序中的异常类型以及处理方式 exception 常见的异常类型 ex
  • 1698_python编程_测试与debug

    全部学习汇总 xff1a GreyZhang python basic My learning notes about python github com 学习了一下这一周的课程 xff0c 讲的主要是测试以及Bug调试方面的东西 在之前我
  • 1699_simulink代码生成配置初级方案

    全部学习汇总 xff1a GreyZhang g matlab MATLAB once used to be my daily tool After many years when I go back and read my old lea
  • 1700_VIM代码自动补齐配置

    全部学习汇总 xff1a GreyZhang editors skills Summary for some common editor skills I used github com 欢迎路过的YUAN类同胞相互交流 xff0c 指点指
  • Python2 备份网站目录并上传百度网盘

    最近用WordPress建了个个人博客 xff0c 本着数据无价的原则编写了本脚本对数据库和网址目录进行备份并上传到百度网盘里 话不多说 xff0c 下面就该Python脚本的程序依赖 代码说明及使用方法进行叙述 一 程序依赖 1 安装Py
  • 1701_week5_效率与搜索

    全部学习汇总 xff1a GreyZhang python basic My learning notes about python github com 这一周的课程很早就学完了 xff0c 碰上自己昼夜加班周末不休的时段一直也没有整理学
  • 1702_week6_面向对象编程

    全部学习汇总 xff1a GreyZhang python basic My learning notes about python github com 放一下自己的联系方式 xff0c 软件爱好者欢迎交流 邮箱 xff1a greyzh
  • 1703_LibreOffice常用功能使用体验

    全部学习汇总 xff1a GreyZhang windows skills some skills when using windows system github com 首先需要说明的是我不是一个重度Office用户 xff0c 甚至算
  • 1704_Linux与Windows使用体验对比

    全部学习汇总 xff1a GitHub GreyZhang little bits of linux My notes on the trip of learning linux 我在我的微博上发过几次对比两个操作系统使用体验的微博 xff
  • 1705_Python处理中文经验与实践

    全部学习汇总 xff1a GreyZhang python basic My learning notes about python github com 曾经在很长的一段时间内 xff0c Python处理中文的时候真是把我难坏了 总觉得
  • 1706_Python中带余数除法

    全部学习汇总 xff1a GitHub GreyZhang python basic My learning notes about python 欢迎路过的YUAN类朋友们 xff0c 希望我们能够相互交流共同成长 如有错误或者不足希望及
  • 1707_Python中的多成员处理

    全部学习汇总 xff1a GreyZhang python basic My learning notes about python github com 欢迎路过的YUAN类朋友们 xff0c 希望我们能够相互交流共同成长 如有错误或者不
  • 1708_Simulink中取数组元素

    全部学习汇总 xff1a GitHub GreyZhang g matlab MATLAB once used to be my daily tool After many years when I go back and read my
  • STM32F407 CUBEMX+HAL库完成对XPT2064触摸屏控制芯片的驱动

    硬件介绍 首先介绍一下硬件 xff0c 我购买的液晶屏大小为480 320 xff0c 液晶屏控制芯片为ST996S xff0c 两者均采用SPI通讯协议 xff0c 这节只讲触摸屏控制芯片XPT2064的部分 如果你需要阅读有关液晶屏控制
  • C++ (STL BOOST) 智能指针的一些解析

    C 43 43 xff08 STL BOOST xff09 智能指针的一些解析 xff0c 包括智能指针的原理 xff0c 智能指针的一些使用 只有了解了原理才能真正用对他们 现在blog的文章几乎就是一把抄 郁闷 C 43 43 里面内存
  • Python安装第三方库PIL时失败的解决办法

    Python中 xff0c 安装第三方模块 xff0c 是通过setuptools这个工具完成的 Python有两个封装了setuptools的包管理工具 xff1a easy install和pip 目前官方推荐使用pip 安装一个第三方
  • 在VMware上安装Ubuntu详细教程

    目录 1 先下载好VMware Workstation Pro 2 下载Ubuntu系统镜像 3 在VMware新建虚拟机 4 开启虚拟机 xff0c 安装Ubuntu 这时我们发现由于窗口太小无法安装 作为全球最流行且最有影响力的Linu
  • 树莓派 Linux 下的串口通讯 (C语言)

    运行环境 xff1a Ubuntu14 04 树莓派3B 43 功能 xff1a 实现串口数据的收发 main c文件 include 34 com h 34 define BUFFER SIZE 30 最大缓存区 char pstr 61