树莓派 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语言) 的相关文章

  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同
  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • 未找到 Gem 命令

    我已经在 Ubuntu 10 10 32 位上安装了 gem apt get install gem y 但当我尝试跑步时 gem install something gem 我收到未找到命令的错误 bash gem command not
  • 查看 Linux 上的多核或多 CPU 利用率

    我有一个在 Linux 上运行的程序 我需要确定它如何利用所有 CPU 内核 有没有什么程序可以查看这些信息 跑过 top 命令并按下 1 查看各个核心
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 如何在 Linux 中重新添加 unicode 字节顺序标记?

    我有一个相当大的 SQL 文件 它以 FFFE 的字节顺序标记开头 我使用 unicode 感知的 linux 分割工具将此文件分割成 100 000 行块 但是当将这些传递回窗口时 它确实not与第一个部分以外的任何部分一样 只是它具有
  • 运行此处编译的 C 程序会导致在另一台服务器上找不到 GLIBC 库错误 - 是我的错还是他们的错?

    此处编译的 C 程序在我们的 Ubuntu 服务器上运行良好 但是当其他人尝试在他们的特定 Linux 服务器上运行它时 他们会收到以下错误 myprog install lib tls libc so 6 version GLIBC 2
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称

随机推荐

  • 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