差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
template:temp_uart [2023/02/07 17:15]
wjj
template:temp_uart [2023/02/21 18:31] (当前版本)
wjj
行 1: 行 1:
-系统下操作 UART 的测试串口,以 COM2 测试为例:+系统下操作 UART 的测试串口,以 J_RS232 TX3\RX3 测试为例:
  
-COM2 设备节点为:+J_RS232 TX3\RX3 设备节点为:
  
-  /dev/ttyXRUSB0+ /dev/ttysWK2
  
 C参考UART高低电平输入代码如下: C参考UART高低电平输入代码如下:
行 10: 行 10:
 #include <stdio.h> #include <stdio.h>
 #include <stdlib.h> #include <stdlib.h>
 +#include <string.h>
 +#include <unistd.h>
 #include <sys/types.h> #include <sys/types.h>
 #include <sys/stat.h> #include <sys/stat.h>
 #include <fcntl.h> #include <fcntl.h>
-#include <unistd.h> +#include <termios.h> 
-#include <string.h> +#include <errno.h> 
-  +int set_opt(int,int,int,char,int); 
-  + 
-static char gpio_path[100]; +void main()
-static int gpio_config(const char *attrconst char *val+ int fd,nByte; 
-+ char *uart3 = "/dev/ttyS2"; 
-    char file_path[100]; + char bufferR[2]; 
-    int len+ char bufferW[2];  
-    int fd; + 
-    sprintf(file_path"%s/%s"gpio_pathattr); + memset(bufferR'\0'2); 
-    if (0 > (fd = open(file_pathO_WRONLY))) { + memset(bufferW'\0', 2); 
-        perror("open error"); + 
-        return fd; + if((fd=open(uart3,O_RDWR,0777))<0) 
-    +
-    len strlen(val); + printf("failed\n"); 
-    if (len !write(fd, vallen)) { +
-        perror("write error"); + else{ 
-        close(fd); + printf("success\n"); 
-        return -1+ set_opt(fd, 115200, 8, 'N', 1);  
-    + 
-    close(fd); //关闭文件 +
-    return 0;+ 
 + 
 + while(1){  
 + 
 + nByte 0; 
 + 
 + memset(bufferR, '\0', 2); 
 + memset(bufferW, '\0', 2); 
 + 
 +          // printf("hello\n"); 
 +   if((nByte read(fd, bufferR1)) == 1){      //MCU串口发送接收都是单字节(单字符)函数 
 + 
 + 
 +     printf("receive:%c\n",bufferR[0]); 
 +  
 + bufferW[0] = 'A'; 
 + 
 + write(fd,bufferW,1);                    //串口发送单字节(单字符)  buffer[0] = data 
 + 
 + 
 + memset(bufferR, '\0', 2)
 +     memset(bufferW, '\0', 2); 
 +  
 + nByte = 0; 
 +   
 + 
 +
 + 
 + close(fd); 
 +
 } }
-  + 
-int main(int argc, char *argv[])+//串口通用初始化函数 
 +int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
 { {
-    char file_path[100]+ struct termios newtio,oldtio;//定义结构体newtio和oldtio 
-    char val; + //将原串口的数据取到oldtio 
-    int fd; + if  tcgetattr( fd,&oldtio)  !=  0) {  
-    /* 校验传参 *+ perror("SetupSerial 1"); 
-    if (!= argc) { + return -1; 
-        fprintf(stderr, "usage: %s <gpio>\n", argv[0]); +
-        exit(-1)+ //将newio清零和设置c_cflag 
-    + bzero&newtiosizeof( newtio ) ); 
-    /* 判断指定编号的 GPIO 是否导出 *+ newtio.c_cflag  |=  CLOCAL | CREAD;//使能接收和忽略控制线 
-    sprintf(gpio_path"/sys/class/gpio/gpio%s", argv[1]); + newtio.c_cflag &= ~CSIZE; 
-    if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出 + //设置数据位 
-        int len+ switch( nBits ) 
-        if (0 > (fd open("/sys/class/gpio/export", O_WRONLY))) { +
-        perror("open error"); + case 7: 
-        exit(-1); + newtio.c_cflag |= CS7
-        } + break; 
-    len = strlen(argv[1]); + case 8: 
-    if (len != write(fdargv[1], len)) {//导出 gpio + newtio.c_cflag |= CS8; 
-        perror("write error"); + break; 
-        close(fd); +
-        exit(-1); + //设置校验位 
-        } + switchnEvent ) 
-    close(fd); //关闭文件 + { 
-    } + //偶校验 
-  + case 'O': 
-    /* 配置为输入模式 */ + newtio.c_cflag |= PARENB;//使能奇偶校验 
-    if (gpio_config("direction""in")+ newtio.c_cflag |= PARODD;//偶校验 
-    exit(-1); + newtio.c_iflag |= (INPCK | ISTRIP);//输入校验并忽略第八位 
-    /* 极性设置 */ + break; 
-    if (gpio_config("active_low", "0")) + case 'E':  
-    exit(-1); + newtio.c_iflag |= (INPCK | ISTRIP); 
-    /* 配置为非中断方式 *+ newtio.c_cflag |= PARENB; 
-    if (gpio_config("edge", "none")+ newtio.c_cflag &= ~PARODD;//取消偶校验(置零偶校验位),开启奇校验 
-    exit(-1)+ break; 
-    /读取 GPIO 电平状态 */ + case 'N':   
-    sprintf(file_path, "%s/%s", gpio_path, "value")+ newtio.c_cflag &= ~PARENB;//不进行奇偶校验 
-    if (0 > (fd = open(file_pathO_RDONLY))) { + break; 
-        perror("open error"); +
-        exit(-1); + //设置波特率 
-    } + switch( nSpeed ) 
-  +
-    if (0 > read(fd, &val, 1)) { + case 2400: 
-        perror("read error"); + cfsetispeed(&newtio, B2400); 
-        close(fd); + cfsetospeed(&newtio, B2400); 
-        exit(-1)+ break; 
-    + case 4800: 
-    printf("value: %c\n", val); + cfsetispeed(&newtio, B4800); 
-    /* 退出程序 */ + cfsetospeed(&newtio, B4800); 
-    close(fd); + break; 
-    exit(0);+ case 9600: 
 + cfsetispeed(&newtioB9600); 
 + cfsetospeed(&newtio, B9600); 
 + break; 
 + case 115200: 
 + cfsetispeed(&newtio, B115200); 
 + cfsetospeed(&newtio, B115200); 
 + break; 
 + case 460800: 
 + cfsetispeed(&newtio, B460800); 
 + cfsetospeed(&newtio, B460800); 
 + break; 
 + default: 
 + cfsetispeed(&newtioB9600); 
 + cfsetospeed(&newtio, B9600); 
 + break; 
 +
 + //设置停止位 
 + if( nStop == 1 ) 
 + newtio.c_cflag & ~CSTOPB;//一位停止位 
 + else if ( nStop == 2 
 + newtio.c_cflag |=  CSTOPB;//两位停止位 
 + 
 + newtio.c_cc[VTIME]  = 0;//不设置读取超时 
 + newtio.c_cc[VMIN] = 0;//读取最小字符数为0 
 + 
 + tcflush(fd,TCIFLUSH);//清空缓冲区 
 +  
 + //使配置生效 
 + if((tcsetattr(fd,TCSANOW,&newtio))!=0) 
 +
 + perror("com set error"); 
 + return -1; 
 +
 + // printf("set done!\n\r"); 
 + return 0;
 } }
 +
 </code> </code>
  
行 99: 行 167:
 将编译好的程序使用 scp 拷贝到 3399 主板上,执行测试: 将编译好的程序使用 scp 拷贝到 3399 主板上,执行测试:
  
-{{:arm:rk3399:linux:uart编程-1.png?600|}}+{{:arm:rk3399:linux:r39s2_uart.c.png?600|}}
打印/导出