OrangePi3 LTS 驱动开发-uart通信

news/2024/11/24 12:57:52/

OrangePi3 LTS 驱动开发-uart通信

kernel版本:orange-pi-5.10-media

5.1x版本,uart3默认是关闭的,需要在orangepiEnv.txt中添加overlays=uart3字样开启uart3。如果不添加,默认设置为开,需要更高dts中的配置。

1、修改sun50i-h6.dtsi文件,屏蔽以下内容

	// uart3_rts_cts_pins: uart3-rts-cts-pins {// 	pins = "PD25", "PD26";// 	function = "uart3";// };

2、修改sun50i-h6-orangepi-3-lts.dts文件
添加一下内容

model = "OrangePi 3 LTS";
compatible = "xunlong,orangepi-3-lts", "allwinner,sun50i-h6";aliases {serial0 = &uart0;serial1 = &uart1;serial3 = &uart3;serial9 = &r_uart;i2c0 = &i2c0;spi1 = &spi1;ethernet0 = &emac;
};&uart3 {pinctrl-names = "default";pinctrl-0 = <&uart3_pins>;status = "okay";
};			

替换编译的dtb,重启应该就默认开启uart3

App测试demo,orangepi里编写,直接gcc 编译运行即可。
usb转串口小板 tx rx接26pin的uart3 ,
电脑端用串口助手发送hello
香橙派3 发送hello world,会看到图示现象。
在这里插入图片描述

源码:

#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>speed_t getBaudRate(int baudRate)
{switch(baudRate) {case 0: return B0;case 50: return B50;case 75: return B75;case 110: return B110;case 134: return B134;case 150: return B150;case 200: return B200;case 300: return B300;case 600: return B600;case 1200: return B1200;case 1800: return B1800;case 2400: return B2400;case 4800: return B4800;case 9600: return B9600;case 19200: return B19200;case 38400: return B38400;case 57600: return B57600;case 115200: return B115200;case 230400: return B230400;case 460800: return B460800;case 500000: return B500000;case 576000: return B576000;case 921600: return B921600;case 1000000: return B1000000;case 1152000: return B1152000;case 1500000: return B1500000;case 2000000: return B2000000;case 2500000: return B2500000;case 3000000: return B3000000;case 3500000: return B3500000;case 4000000: return B4000000;default: return -1;}
}int setParity(int fd,int dataBits,int stopBits,int parity)
{struct termios options;if (tcgetattr (fd, &options) != 0) {printf ("SetupSerial 1");return (-1);}options.c_cflag &= ~CSIZE;switch (dataBits) {case 7:options.c_cflag |= CS7;break;case 8:options.c_cflag |= CS8;break;default:fprintf (stderr, "Unsupported data size\n");return (-1);}switch (parity) {case 'n':case 'N':options.c_cflag &= ~PARENB; /* Clear parity enable */options.c_iflag &= ~INPCK;  /* Enable parity checking */break;case 'o':case 'O':options.c_cflag |= (PARODD | PARENB);options.c_iflag |= INPCK;   /* Disable parity checking */break;case 'e':case 'E':options.c_cflag |= PARENB;  /* Enable parity */options.c_cflag &= ~PARODD;options.c_iflag |= INPCK;   /* Disable parity checking */break;case 'S':case 's':           /*as no parity */options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;break;default:fprintf (stderr, "Unsupported parity\n");return (-1);
}
switch (stopBits) {case 1:options.c_cflag &= ~CSTOPB;break;case 2:options.c_cflag |= CSTOPB;break;default:fprintf (stderr, "Unsupported stop bits\n");return (-1);
}/* Set input parity option */
if (parity != 'n')options.c_iflag |= INPCK;
tcflush (fd, TCIFLUSH);
options.c_cc[VTIME] = 0x01;
options.c_cc[VMIN] =  0xFF; /* Update the options and do it NOW */
//qd to set raw mode, which is copied from web
options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP| INLCR | IGNCR | ICRNL | IXON);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
options.c_cflag &= ~(CSIZE | PARENB);
options.c_cflag |= CS8;if (tcsetattr (fd, TCSANOW, &options) != 0) {perror ("SetupSerial 3");return (-1);
}return 0;
}int serialOpen(const char *path, int baudRate)
{int fd;speed_t speed;/* Check arguments */
{speed = getBaudRate(baudRate);if (speed == -1) {printf("get Baud rate error\n");return -1;}
}
{fd = open(path, O_RDWR);if (fd == -1){printf("open serial error =%d\n",fd);return -1;}
}
/* Configure device */
{struct termios cfg;if (tcgetattr(fd, &cfg)){printf("tcgetattr() failed\n");close(fd);return -1;}cfmakeraw(&cfg);cfsetispeed(&cfg, speed);cfsetospeed(&cfg, speed);if (tcsetattr(fd, TCSANOW, &cfg)){printf("tcsetattr() failed\n");close(fd);return -1;}
}
setParity(fd,8,1,'N');
printf("open Success==%d\n",fd);
return fd;
}int serialWrite(int fd,char *writeData,int len)
{if (fd > 0){write(fd,writeData,len);}else{printf("[File]=%s[Function]=%s error\n",__FILE__,__FUNCTION__);return -1;
}
return 0;
}int serialRead(int fd,char *readData,int len)
{size_t size = 0;if (fd > 0){size = read(fd,readData,len);}else{printf("[File]=%s[Function]=%s error\n",__FILE__,__FUNCTION__);return -1;
}
return size;
}int serialClose(int fd)
{close(fd);return 0;
}void *uart_read_thread(void *arg){int fd = *((int *)arg);size_t  size ;        char r_data[256] = {0};while(1){size = serialRead(fd,r_data,256); //阻塞方式去读if (size > 0){printf("get data %s\n",r_data);}}åprintf("fd == %d in thread\n ",fd);
}int main(int argc,char *argv)
{int fd = 0;int ret;char w_data[] = "hello world\n";pthread_t m_read_thread ;fd = serialOpen("/dev/ttyS3",115200);if (fd > 0){printf("open ttyS3 ok\n");}else{printf("open ttyS3 fail\n");return -1;}ret = pthread_create(&m_read_thread,NULL,uart_read_thread,&fd);if (ret){perror("pthread_create error\n");return -1;}//pthread_join(m_read_thread,NULL);while (1){serialWrite(fd,w_data,strlen(w_data));sleep(2);}printf("hello world\n");
}

http://www.ppmy.cn/news/345157.html

相关文章

学习vi和vim编辑器(3):简单的文本编辑(2)

接着上一篇文章&#xff0c;继续讲解vi编辑器中一些简单的文本编辑命令。这一篇文章主要是文本的删除&#xff0c;复制&#xff0c;移动等命令。 删除文本&#xff1a; 正如上一篇文章中讲过的&#xff0c;对于删除命令&#xff08;"d"&#xff09;也具有“(comman…

对于摄像机而言同样清晰度下25p和50i画质会有什么差别?

作者&#xff1a;worldream 链接&#xff1a;https://www.zhihu.com/question/26796732/answer/135024474 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 50i其实就是50fps——从摄像机的摄像管原始信号出发 模拟电视…

对视频50p,50i 还有25p,25i区别的粗劣解释

对视频50p,50i 还有25p,25i区别的粗劣解释 首先跟你解释p和i的概念&#xff0c;p是逐行扫描模式&#xff0c;i是隔行扫描模式。 帧速率有以下几种&#xff1a; 60帧/秒&#xff08;实际为59.94帧/秒&#xff0c;为方便起见&#xff0c;记为60帧/秒&#xff09; 50帧/秒、 3…

QT中信号和槽的概念

信号就是发生什么事件&#xff0c;槽就是触发什么函数&#xff0c;所以信号与槽就是发生什么事件(比如点击某个按钮)然后就会触发某个函数 connect(信号的发送者&#xff0c;发送的具体信号&#xff0c;信号的接受者&#xff0c;信号的处理&#xff09; connect(myButton , &a…

【服务器数据恢复】热备盘激活失败导致raid5瘫痪的数据恢复案例

服务器数据恢复环境&#xff1a; 一台EMC存储中数块磁盘组建了一组raid5磁盘阵列&#xff0c;阵列中有2块热备盘&#xff1b;上层采用ZFS文件系统&#xff0c;划分了一个lun&#xff0c;供sun小机使用。 服务器故障&检测&#xff1a; 存储在正常运行中突然崩溃无法使用&…

网络安全零基础之从原理看懂的XSS

01、XSS 的原理和分类 跨站脚本攻击 XSS(Cross Site Scripting)&#xff0c;为了不和层叠样式表(Cascading Style Sheets&#xff0c;CSS)的缩写混淆 故将跨站脚本攻击缩写为 XSS&#xff0c;恶意攻击者往 Web 页面里插入恶意 Script 代码&#xff0c;当用户浏览该页面时&…

NaveGo:MATLAB /GNU Octave 集成导航工具箱--介绍

对于惯性导航系统&#xff08;INS&#xff09;的应用领域&#xff0c;例如无人驾驶、无人机、机器人等&#xff0c;高效地处理和融合来自不同传感器的数据是至关重要的。如今&#xff0c;我们有幸介绍一款强大的工具箱——NaveGo&#xff0c;这是一个使用MATLAB/GNU Octave的集…

内网隧道代理技术(三)之使用SSH端口转发

使用SSH端口转发 SSH介绍 SSH通过网络远程访问主机提供保护&#xff0c;可以对客户端和服务端之间的数据传输进行压缩和加密&#xff0c;有身份验证、SCP、SFTP、和端口转发的功能 SSH转发常用的参数介绍&#xff1a; 参数作用-C请求压缩所有数据-D动态转发、即socks代理-f…