uart这里的调试要注意的是管脚的功能配置,需要更改设备树文件;

更改设备树文件:https://blog.csdn.net/cao849861802/article/details/111604277

其他问题:这里是操作的232的配置,如果想做485的最好用硬件来直接做485,因为我这边用软件尝试了几次都未成功。

#include <stdio.h>        //标准输入输出,如printf、scanf以及文件操作
#include <stdlib.h>        //标准库头文件,定义了五种类型、一些宏和通用工具函数
#include <unistd.h>        //定义 read write close lseek 等Unix标准函数
#include <sys/types.h>    //定义数据类型,如 ssiz e_t off_t 等
#include <sys/stat.h>    //文件状态
#include <fcntl.h>        //文件控制定义
#include <termios.h>    //终端I/O
#include <errno.h>        //与全局变量 errno 相关的定义
#include <getopt.h>        //处理命令行参数
#include <string.h>        //字符串操作
#include <time.h>        //时间
#include <sys/select.h>    //select函数#include <sys/ioctl.h>
#include <net/if.h>
#include <pthread.h>int uartfd[7];int setOpt(int fd, int nSpeed, int nBits, int nParity, int nStop)
{struct termios newtio, oldtio;// 保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息if (tcgetattr(fd, &oldtio) != 0){perror("SetupSerial 1");return -1;}bzero(&newtio, sizeof(newtio));        //新termios参数清零newtio.c_cflag |= CLOCAL | CREAD;    //CLOCAL--忽略 modem 控制线,本地连线, 不具数据机控制功能, CREAD--使能接收标志// 设置数据位数newtio.c_cflag &= ~CSIZE;    //清数据位标志switch (nBits){case 7:newtio.c_cflag |= CS7;break;case 8:newtio.c_cflag |= CS8;break;default:fprintf(stderr, "Unsupported data size\n");return -1;}// 设置校验位switch (nParity){case 'o':case 'O':                     //奇校验newtio.c_cflag |= PARENB;newtio.c_cflag |= PARODD;newtio.c_iflag |= (INPCK | ISTRIP);break;case 'e':case 'E':                     //偶校验newtio.c_iflag |= (INPCK | ISTRIP);newtio.c_cflag |= PARENB;newtio.c_cflag &= ~PARODD;break;case 'n':case 'N':                    //无校验newtio.c_cflag &= ~PARENB;break;default:fprintf(stderr, "Unsupported parity\n");return -1;}// 设置停止位switch (nStop){case 1:newtio.c_cflag &= ~CSTOPB;break;case 2:newtio.c_cflag |= CSTOPB;break;default:fprintf(stderr,"Unsupported stop bits\n");return -1;}// 设置波特率 2400/4800/9600/19200/38400/57600/115200/230400switch (nSpeed){case 2400:cfsetispeed(&newtio, B2400);cfsetospeed(&newtio, B2400);break;case 4800:cfsetispeed(&newtio, B4800);cfsetospeed(&newtio, B4800);break;case 9600:cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break;case 19200:cfsetispeed(&newtio, B19200);cfsetospeed(&newtio, B19200);break;case 38400:cfsetispeed(&newtio, B38400);cfsetospeed(&newtio, B38400);break;case 57600:cfsetispeed(&newtio, B57600);cfsetospeed(&newtio, B57600);break;case 115200:cfsetispeed(&newtio, B115200);cfsetospeed(&newtio, B115200);break;case 230400:cfsetispeed(&newtio, B230400);cfsetospeed(&newtio, B230400);break;default:printf("\tSorry, Unsupported baud rate, set default 9600!\n\n");cfsetispeed(&newtio, B9600);cfsetospeed(&newtio, B9600);break;}// 设置read读取最小字节数和超时时间newtio.c_cc[VTIME] = 1;     // 读取一个字符等待1*(1/10)snewtio.c_cc[VMIN] = 1;        // 读取字符的最少个数为1tcflush(fd,TCIFLUSH);         //清空缓冲区if (tcsetattr(fd, TCSANOW, &newtio) != 0)    //激活新设置{perror("SetupSerial 3");return -1;}printf("Serial set done!\n");return 0;
}void uartFdCreate()
{int i = 0;int ret = 0;char buf[64];for(i = 0; i < 7; i++){memset(buf,0,sizeof(buf));sprintf(buf,"/dev/ttymxc%d",i+1);uartfd[i] = open(buf, O_RDWR | O_NOCTTY | O_NDELAY);if(uartfd[i] < 0){printf("%s open failed ret = %d\r\n",buf,uartfd[i]);uartfd[i] = -1;continue;}ret = fcntl(uartfd[i], F_SETFL, 0);if(ret < 0){printf("fcntl failed ret = %d\r\n",ret);close(uartfd[i]);uartfd[i] = -1;continue;}if (isatty(uartfd[i]) == 0){printf("standard input is not a terminal device\r\n");close(uartfd[i]);uartfd[i] = -1;continue;   }if (setOpt(uartfd[i], 115200, 8, 'N', 1)== -1)    //设置8位数据位、1位停止位、无校验{printf("Set opt Error\r\n");close(uartfd[i]);uartfd[i] = -1;continue;             }tcflush(uartfd[i], TCIOFLUSH);    //清掉串口缓存fcntl(uartfd[i], F_SETFL, 0);    //串口阻塞printf("uart%d fd create ok,fd = %d\r\n",i+1,uartfd[i]);}
}void *uartrecv(void *arg)
{int i = 0;unsigned int maxfd = 0;unsigned int ret = 0;struct timeval waittime;fd_set rfd;char buf[128];printf("uart recv task stat****\r\n");while(1){FD_ZERO(&rfd);for(i = 0; i < 7; i++){if(uartfd[i] != -1){FD_SET(uartfd[i],&rfd);if(maxfd < uartfd[i]){maxfd = uartfd[i];}}}waittime.tv_sec = 1;waittime.tv_usec = 0;ret = select(maxfd + 1,&rfd,NULL,NULL,&waittime);if(0 >= ret){continue;}for(i = 0; i < 7; i++){if(FD_ISSET(uartfd[i],&rfd)){memset(buf,0,sizeof(buf));read(uartfd[i],buf,sizeof(buf) - 1);printf("uart%d recv buf = %s\r\n",i+1,buf);}}}
}void main()
{int i = 0;int retlen = 0;char buf[128];pthread_t ntid;uartFdCreate();pthread_create(&ntid, NULL, uartrecv, NULL);while(1){for(i = 0 ; i < 7; i++){if(uartfd[i] != -1){memset(buf,0,sizeof(buf));sprintf(buf,"this is uart%d send date",i+ 1);retlen = write(uartfd[i],buf,strlen(buf));if(retlen != strlen(buf)){tcflush(uartfd[i],TCOFLUSH);}}} sleep(5);}
}

imx6ul uart8路串口调试(代码)相关推荐

  1. 迅为-IMX6UL开发板丨双网口丨双CAN总线丨4路USB HOST丨2路串口、6路插座引出,共8路串口丨1路RGB信号丨2路LVDS信号

    迅为iMX6UL开发板多路串口开发平台 迅为i.MX 6UL开发板基于ARM Cortex-A7内核,主频高达528 MHz,内存:512MDDR3 存储:8G EMMC,支持2路CAN,2路百兆以太 ...

  2. ESP8266 WIFI 模块串口调试过程-实现通过互联网实现数据远程传输(结尾含驱动代码链接)

    一. ESP8266 WIFI模块调试(串口发送AT指令调试). ESP8266 WIFI模块的调试算是最复杂的了,虽然通信是简单的串口通信,但是要设置ESP8266连接服务器并稳定无误的将数据上传, ...

  3. DIY一款4路USB转TTL串口调试模块

    目录 1.电源设计 2.USB集线器设计 3.USB转TTL设计 4.模块效果 最近调测程序经常用到单片机的三个串口同时交互通信,我使用1路USB转TTL串口调试模块不断切换,不仅影响观察效果,更是劳 ...

  4. 称重串口调试软件 可以用usb485通信 欧路达称重模块 调试 寻地址 模块和plc

    称重串口调试软件 可以用usb485通信 欧路达称重模块 调试 寻地址 模块和plc 编号:4118656219706867天道酬勤

  5. 【单片机学习笔记】(31):串口调试技巧、TFT触摸屏初识别、stm32F4与F1对比使用(全系列初始化概览)、YSF4的光耦隔离保护、外部中断与定时器消抖相结合的按键检

    串口调试技巧 可以将调试时会用到,但实际演示是不需要用到的代码用 #if xxx   //这里放调试代码 #endif xxx是 一个宏定义,如果等于0则不编译相关代码,如果为1则编译相关代码 TFT ...

  6. 记录一次自己调试代码的过程

    今年年初我们做了一套防窃电的软件,其中通讯采取的是串口方式.前段时间,根据现场的反馈,我们增加了蓝牙通讯的功能.系统界面如下图所示: 今天,现场人员反馈说:"解析的数据出现问题", ...

  7. 串口调试助手c语言程序,串口调试助手C语言源程序

    串口调试助手C语言源程序 串口调试助手源程序 及编程详细过程 作者:龚建伟 2001.6.20 可以任意转载,但必须注明作者和说明来自http://doc.xuehai.net,不得作为商用 目次: ...

  8. stm32中如何进行printf重定向用于串口调试输出

    1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化, vo ...

  9. C#之windows桌面软件第三课:完整的串口调试助手

    接上一节,这节来编写一个完整的串口调试助手! using System; using System.Collections.Generic; using System.ComponentModel; ...

最新文章

  1. 基于px2rpx-loader,探讨一下loader的封装思想
  2. HDU4686 Arc of Dream —— 矩阵快速幂
  3. Docker笔记整理
  4. 引用另一个Android工程的方法详解
  5. C++ : 内联函数和引用变量
  6. 万级 K8S 集群背后,etcd 如何保持稳定性?
  7. python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目
  8. python题目训练(随时更新)
  9. ASO优化技巧:利用好App下载周期变化,aso优化技巧介绍
  10. ionic刷新html页面,Ionic实现页面下拉刷新(ion-refresher)功能代码
  11. 撇开PUE,评估数据中心增长的真正环境影响
  12. 微服务架构之限流熔断
  13. 在Mac中删除残留的启动台图标
  14. 如何用Jquery获取某一个Div的Class或者ID
  15. 35个极好的高质量PSD源文件网站三
  16. 古文觀止卷九_永州韋使君新堂記_柳宗元
  17. JXTA技术与应用发展
  18. 搜狗搜索X知乎:世界是这样检索的
  19. Block的简单理解
  20. position:absolute与position:relative的区别

热门文章

  1. Android颜色对照表
  2. 第152章 SQL函数 $TSQL_NEWID
  3. c语言设计学生结构体,c语言程序设计编程题目:请 :编写完成对学生相关信息的要求:1.定义一个结构体类型student,其中包括三个成...
  4. CTPN文本检测网络
  5. Windows RDS远程会话服务
  6. 【Command】sudo rm -rf /* 啥效果?
  7. Toshiba Satellite U300由预装Vista系统改装Windows XP系统遇到的问题
  8. 删除的手机短信怎么恢复
  9. 温故而知新(一)Halcon 画线,虚线,圆,矩形
  10. Matlab使用Usrp进行数据收发