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

文章目录

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

H616 把玩注意:

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

uart5 即ttyS5串口通讯口

配置示例
c{.line-numbers} 复制代码
orangepi@orangepizero2:~/y$ uname -r //查看内核版本
5.16.17-sun50iw9 

//打开修改boot下的配置文件
orangepi@orangepizero2:~/y$ sudo vi  /boot/orangepiEnv.txt
    1 verbosity=7
    2 bootlogo=serial
    3 console=both
    4 disp_mode=1920x1080p60
    5 overlay_prefix=sun50i-h616
    6 rootdev=UUID=5e468073-a25c-4048-be42-7f5    cfc36ce25
    7 rootfstype=ext4
    8 overlays=i2c3 uart5  //在这里添加适配i2c-3和uart5
    9 usbstoragequirks=0x2537:0x1066:u,0x2537:    0x1068:u
分文件编译时需将每个文件一同编译 (空格隔开)
例: ggc a.c b.c b.h -lpthread -lxxx...;
c{.line-numbers} 复制代码
常用可封装成一个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
c{.line-numbers} 复制代码
/* 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
c{.line-numbers} 复制代码
/* 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
c{.line-numbers} 复制代码
/* 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) ;	// 10mS
	return 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
c{.line-numbers} 复制代码
/* 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 ;
}
相关推荐
中國龍在廣州4 分钟前
现在人工智能的研究路径可能走反了
人工智能·算法·搜索引擎·chatgpt·机器人
快手技术5 分钟前
NeurIPS 2025 | 可灵团队提出 Flow-GRPO, 首次将在线强化学习引入流匹配生成模型
算法
星释18 分钟前
Rust 练习册 67:自定义集合与数据结构实现
数据结构·算法·rust
yuan1999742 分钟前
AD7689 12位串行ADC驱动与应用
单片机·嵌入式硬件
磨十三1 小时前
MCU 时钟系统全解析:主时钟、PLL、分频与外设时钟门控
arm开发·单片机·嵌入式硬件
lingggggaaaa1 小时前
免杀对抗——C2远控篇&PowerShell&有无文件落地&C#参数调用&绕AMSI&ETW&去混淆特征
c语言·开发语言·笔记·学习·安全·microsoft·c#
口袋物联1 小时前
设计模式之建造者模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·建造者模式
逐步前行1 小时前
Proteus 8.9(四)51单片机仿真
嵌入式硬件·51单片机·proteus
前端小L1 小时前
图论专题(十九):DAG上的“关键路径”——极限规划「并行课程 III」
算法·矩阵·深度优先·图论·宽度优先
scx201310041 小时前
20251116 树状DP总结
算法·深度优先·图论