【全志H616 使用标准库 完成自制串口库(分文件实现) orangepi zero2(开源)】.md updata: 23/11/07

本文主要是介绍【全志H616 使用标准库 完成自制串口库(分文件实现) orangepi zero2(开源)】.md updata: 23/11/07,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • H616 把玩注意:
        • Linux内核版本5.16 及以上,需手动配置i2c-3 uart5驱动
          • 配置示例
        • 分文件编译时需将每个文件一同编译 (空格隔开)
          • 例: ggc a.c b.c b.h -lpthread -lxxx..;
      • 常用命令
        • 查看驱动文件
        • 查看内核检测信息/硬件
      • 使用wiringPi库 完成串口通讯程序:
        • serialTest.c
      • 使用标准库 完成自制串口库(分文件实现):
        • uartTool.h
        • uartTool.c
        • my_uart_ttyS5_test.c

H616 把玩注意:

Linux内核版本5.16 及以上,需手动配置i2c-3 uart5驱动

uart5 即ttyS5串口通讯口

配置示例
orangepi@orangepizero2:~/y$ uname -r //查看内核版本
5.16.17-sun50iw9 //打开修改boot下的配置文件
orangepi@orangepizero2:~/y$ sudo vi  /boot/orangepiEnv.txt1 verbosity=72 bootlogo=serial3 console=both4 disp_mode=1920x1080p605 overlay_prefix=sun50i-h6166 rootdev=UUID=5e468073-a25c-4048-be42-7f5    cfc36ce257 rootfstype=ext48 overlays=i2c3 uart5  //在这里添加适配i2c-3和uart59 usbstoragequirks=0x2537:0x1066:u,0x2537:    0x1068:u
分文件编译时需将每个文件一同编译 (空格隔开)
例: ggc a.c b.c b.h -lpthread -lxxx…;
常用可封装成一个build.sh 脚本,方便编译;
例:
orangepi@orangepizero2:~/y$ cat build.sh 
gcc $1 uartTool.h uartTool.c -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt 
给sh脚本执行权限后,使用即可完成编译:
orangepi@orangepizero2:~/y$ ./build.sh my_uartxxx.c 

常用命令

查看驱动文件

例_串口:ls /dev/ttyS*
在这里插入图片描述

查看内核检测信息/硬件

例_usb设备:ls /dev/bus/usb

使用wiringPi库 完成串口通讯程序:

serialTest.c
/* serialTest.c */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>int fd;void* func1()
{char buf[32] = {0};char *data = buf;while(1){memset(data,'\0',32);printf("input send data to serial: \n");scanf("%s",data);//发送数据_串口int i = 0;while(*data){serialPutchar (fd, *data++) ;      }}
}void* func2()
{while(1){while(serialDataAvail(fd)){ //接收数据_串口printf("%c",serialGetchar (fd));//清空/刷新写入缓存区(标准输出流 stdout);//确保打印输出立即显示在控制台上,而不是在缓冲区中等待。fflush (stdout) ;}}
}int main ()
{unsigned int nextTime ;pthread_t t1,t2;if ((fd = serialOpen ("/dev/ttyS5", 115200)) < 0){fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;return 1 ;}pthread_create(&t1,NULL,func1,NULL); pthread_create(&t2,NULL,func2,NULL); if (wiringPiSetup () == -1){fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;return 1 ;} while(1){sleep(10);};return 0 ;
}

使用标准库 完成自制串口库(分文件实现):

uartTool.h
/* uartTool.h */
int mySerialOpen (const char *device, const int baud);
void mySerialsend (const int fd,const char* s);
int mySerialread (const int fd,char* buf);
uartTool.c
/* uartTool.c*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "wiringSerial.h"int mySerialOpen (const char *device, const int baud)
{struct termios options ;speed_t myBaud ;int     status, fd ;switch (baud){case    9600:	myBaud =    B9600 ; break ;case  115200:	myBaud =  B115200 ; break ;default:return -2 ;}if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)return -1 ;fcntl (fd, F_SETFL, O_RDWR) ;// Get and modify current options:tcgetattr (fd, &options) ;cfmakeraw   (&options) ;cfsetispeed (&options, myBaud) ;cfsetospeed (&options, myBaud) ;options.c_cflag |= (CLOCAL | CREAD) ;options.c_cflag &= ~PARENB ;options.c_cflag &= ~CSTOPB ;options.c_cflag &= ~CSIZE ;options.c_cflag |= CS8 ;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;options.c_oflag &= ~OPOST ;options.c_cc [VMIN]  =   0 ;options.c_cc [VTIME] = 100 ;	// Ten seconds (100 deciseconds)tcsetattr (fd, TCSANOW, &options) ;ioctl (fd, TIOCMGET, &status);status |= TIOCM_DTR ;status |= TIOCM_RTS ;ioctl (fd, TIOCMSET, &status);usleep (10000) ;	// 10mSreturn fd ;
}void mySerialsend (const int fd,const char* s)
{int ret;ret = write (fd, s, strlen (s));if (ret < 0){printf("Serial Puts Error\n");}
}int mySerialread (const int fd,char* buf)
{int n_read = read (fd, buf, 1);if(n_read < 0){perror("read error");}return n_read ;
}
my_uart_ttyS5_test.c
/* my_uart_ttyS5_test.c */
#include <stdio.h>
#include <string.h>
#include <errno.h>
// #include <wiringPi.h>
// #include <wiringSerial.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>#include "uartTool.h"int fd;void* func1()
{char data[32] = {0};while(1){memset(data,'\0',32);scanf("%s",data);//发送数据_串口mySerialsend (fd, data) ;     }
}void* func2()
{char buf[32] = {0};while(1){while(mySerialread(fd,buf)){ //接收数据_串口printf("%s",buf);        }}
}int main ()
{pthread_t t1,t2;if ((fd = mySerialOpen ("/dev/ttyS5", 115200)) < 0){fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;return 1 ;}pthread_create(&t1,NULL,func1,NULL); pthread_create(&t2,NULL,func2,NULL); while(1){sleep(10);};return 0 ;
}

这篇关于【全志H616 使用标准库 完成自制串口库(分文件实现) orangepi zero2(开源)】.md updata: 23/11/07的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/375766

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr