【OK210试用体验】进阶篇(3)OK210的Linux串口测试 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】进阶篇(3)OK210的Linux串口测试

gjianw217 ( 楼主 ) 2015-9-22 22:13:09  只看该作者 倒序浏览
本帖最后由 gjianw217 于 2015-9-23 00:52 编辑

这篇主要进行OK210的串口测试,主要分为硬件分析和软件测试

(一)硬件分析:
    在OK210试用体验】入门篇(2)板载资源中曾经分析过,OK210开发板上有4个串口,其中串口0、串口1通过排针的形式引出,串口2和串口3通过转换以COM口的形式引出,串口2作为调试用。
       串口0和串口1的对应引脚分别如图所示,即我们通过TTLUSB数据线和电脑相连,进行数据通信,或通过引线与MCU进行串口通信。主要连接的是3引脚(TXD)和8引脚(RXD)。
(二)软件测试:
     OK210开发板,飞凌提供的源码中,已经为用户写好了串口驱动,具体可参见源码目录:
android-kernel-samsung-dev/driver/serial/samsung.candroid-kernel-samsung-dev/driver/serial/s5pv210.c
    开发板上电后,打开串口终端,可见如下信息,说明已经成功加载了4个串口的驱动,具体如下图所示,它们的序号与开发板上的序号一一对应。

    编写串口测试程序,源码如下,其中硬件连接串口0(TTL转USB串口线,要交叉相接,白色接3,绿色接8),即打开串口0,并每隔1s,发送一帧数据。
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include <time.h>

  11. int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
  12. {
  13.     struct termios newtio,oldtio;
  14.     if  ( tcgetattr( fd,&oldtio)  !=  0)
  15.     {
  16.         perror("SetupSerial 1");
  17.         return -1;
  18.     }
  19.     bzero( &newtio, sizeof( newtio ) );
  20.     newtio.c_cflag  |=  CLOCAL | CREAD;
  21.     newtio.c_cflag &= ~CSIZE;

  22.     switch( nBits )
  23.     {
  24.     case 7:
  25.         newtio.c_cflag |= CS7;
  26.         break;
  27.     case 8:
  28.         newtio.c_cflag |= CS8;
  29.         break;
  30.     }

  31.     switch( nEvent )
  32.     {
  33.     case 'O':                     //奇校验
  34.         newtio.c_cflag |= PARENB;
  35.         newtio.c_cflag |= PARODD;
  36.         newtio.c_iflag |= (INPCK | ISTRIP);
  37.         break;
  38.     case 'E':                     //偶校验
  39.         newtio.c_iflag |= (INPCK | ISTRIP);
  40.         newtio.c_cflag |= PARENB;
  41.         newtio.c_cflag &= ~PARODD;
  42.         break;
  43.     case 'N':                    //无校验
  44.         newtio.c_cflag &= ~PARENB;
  45.         break;
  46.     }

  47. switch( nSpeed )
  48.     {
  49.     case 2400:
  50.         cfsetispeed(&newtio, B2400);
  51.         cfsetospeed(&newtio, B2400);
  52.         break;
  53.     case 4800:
  54.         cfsetispeed(&newtio, B4800);
  55.         cfsetospeed(&newtio, B4800);
  56.         break;
  57.     case 9600:
  58.         cfsetispeed(&newtio, B9600);
  59.         cfsetospeed(&newtio, B9600);
  60.         break;
  61.     case 115200:
  62.         cfsetispeed(&newtio, B115200);
  63.         cfsetospeed(&newtio, B115200);
  64.         break;
  65.     default:
  66.         cfsetispeed(&newtio, B9600);
  67.         cfsetospeed(&newtio, B9600);
  68.         break;
  69.     }
  70.     if( nStop == 1 )
  71.     {
  72.         newtio.c_cflag &=  ~CSTOPB;
  73.     }
  74.     else if ( nStop == 2 )
  75.     {
  76.         newtio.c_cflag |=  CSTOPB;
  77.     }
  78.     newtio.c_cc[VTIME]  = 0;
  79.     newtio.c_cc[VMIN] = 0;
  80.     tcflush(fd,TCIFLUSH);
  81.     if((tcsetattr(fd,TCSANOW,&newtio))!=0)
  82.     {
  83.         perror("com set error");
  84.         return -1;
  85.     }
  86.     printf("set done!n");
  87.     return 0;
  88. }

  89. int open_port(int fd,int comport)
  90. {
  91. /*定义串口设备文件*/
  92.     char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2","/dev/ttySAC3"};
  93.     long  vdisable;
  94.     if (comport==1)
  95.     {    fd = open( dev[0], O_RDWR|O_NOCTTY|O_NDELAY);
  96.         if (-1 == fd)
  97.         {
  98.             perror("Can't Open Serial Port 0");
  99.             return(-1);
  100.         }
  101.         else
  102.         {
  103.             printf("open %sn",dev[0]);
  104.         }
  105.     }
  106.     else if(comport==2)
  107.     {    fd = open( dev[1], O_RDWR|O_NOCTTY|O_NDELAY);
  108.         if (-1 == fd)
  109.         {
  110.             perror("Can't Open Serial Port 1");
  111.             return(-1);
  112.         }
  113.         else
  114.         {
  115.             printf("open %sn",dev[1]);
  116.         }   
  117.     }
  118.     else if (comport==3)
  119.     {
  120.         fd = open( dev[2], O_RDWR|O_NOCTTY|O_NDELAY);
  121.         if (-1 == fd)
  122.         {
  123.             perror("Can't Open Serial Port 2");
  124.             return(-1);
  125.         }
  126.         else
  127.         {
  128.             printf("open %sn",dev[2]);
  129.         }
  130.     }
  131.     else if (comport==4)
  132.     {
  133.         fd = open( dev[3], O_RDWR|O_NOCTTY|O_NDELAY);
  134.         if (-1 == fd)
  135.         {
  136.             perror("Can't Open Serial Port 3");
  137.             return(-1);
  138.         }
  139.         else
  140.         {
  141.             printf("open %sn",dev[3]);
  142.         }
  143.     }
  144.     if(fcntl(fd, F_SETFL, 0)<0)
  145.     {
  146.         printf("fcntl failed!n");
  147.     }
  148.     else
  149.     {
  150.         printf("fcntl=%dn",fcntl(fd, F_SETFL,0));
  151.     }
  152.     if(isatty(STDIN_FILENO)==0)
  153.     {
  154.         printf("standard input is not a terminal devicen");
  155.     }
  156.     else
  157.     {
  158.         printf("isatty success!n");
  159.     }
  160.     printf("fd-open=%dn",fd);
  161.     return fd;
  162. }
  163. /*************************************************************/
  164. int main(void)
  165. {
  166.     int fd;
  167.     int nread,i,nwrite;
  168.     char buff[]="Hellotn";

  169.     if((fd=open_port(fd,1))<0)/*1表示打开串口UART0,如果打开UART1,则为2*/
  170.     {
  171.         perror("open_port error");
  172.         return;
  173.     }
  174.     if((i=set_opt(fd,115200,8,'N',1))<0)
  175.     {
  176.         perror("set_opt error");
  177.         return;
  178.     }
  179.     printf("fd=%dn",fd);

  180.         while(1)
  181. {
  182.          nwrite=write(fd,buff,8);
  183.             printf("nread=%d,%sn",nwrite,buff);
  184.         sleep(1);

  185. }
  186.     close(fd);
  187.     return;
  188. }
复制代码
   最后的结果如下所示,上面是电脑上通过ttl转u***串口接收数据,开始是字符显示,后面是16进制显示,有简单的乱码,不知是驱动的问题,还是接线不稳定的原因,下面是串口发送数据的记录。



1个回复

小虎嵌入式 发表于 2015-10-16 16:05:16
收藏下!谢谢分享!
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-4-19 22:16 , Processed in 0.565639 second(s), Total 62, Slave 41 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表