CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 8710|回复: 2

CC-A80 串口测试演示

[复制链接]
发表于 2015-11-9 21:10:38 | 显示全部楼层 |阅读模式
本帖最后由 简单侶途  于 2015-11-9 21:16 编辑

1.最近很多人在CC-A80平台上遇到很多奇怪的串口问题,今天亲生经历了一遍,调试代码,终于成功出现效果。
下面是我找到的参考资料,要注意的是官方资料里面代码有误,正确代码我会给出,请大家对比参考。
A80T uart使用说明书.pdf (894.55 KB, 下载次数: 61)
2.修改后代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <termios.h>//必须包含此头文件
  8. #include <errno.h>

  9. #define FALSE 0
  10. #define TRUE  1

  11. int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  12.         B38400, B19200, B9600, B4800, B2400, B1200, B300, };//波特率

  13. int name_arr[] = {115200, 38400,  19200,  9600,  4800,  2400,  1200,  300,
  14.         38400,  19200,  9600, 4800, 2400, 1200,  300, };

  15. void set_speed(int fd, int speed)
  16. {
  17. int i;
  18.   int status;
  19.   struct termios opt;

  20.   tcgetattr(fd,&opt);

  21.   for (i= 0;i<sizeof(speed_arr)/sizeof(int);i++){
  22.         if(speed == name_arr[i]){
  23.                 printf("set speed!\n");
  24.                  tcflush(fd, TCIOFLUSH);
  25.                        cfsetispeed(&opt, speed_arr[i]);
  26.                  cfsetospeed(&opt, speed_arr[i]);
  27.                 status = tcsetattr(fd, TCSANOW, &opt);

  28.                 if(status != 0)
  29.                    perror("tcsetattr fd1");

  30.                      return;
  31.          }
  32.          printf("no set speed!\n");
  33.          tcflush(fd,TCIOFLUSH);
  34.    }
  35. }

  36. int set_Parity(int fd,int databits,int stopbits,int parity)
  37. {
  38.    struct termios options;
  39.    if( tcgetattr( fd,&options)!= 0){
  40.            perror("SetupSerial 1");
  41.         return(FALSE);
  42.    }

  43.    options.c_cflag &= ~CSIZE;
  44.    switch(databits){
  45.    case 7:
  46.           options.c_cflag |= CS7;
  47.           break;
  48.    case 8:
  49.           options.c_cflag |= CS8;
  50.           break;
  51.    default:
  52.           fprintf(stderr,"Unsupported data size\n");

  53.         return (FALSE);
  54.     }

  55.    switch(parity){
  56.    case 'n':
  57.    case 'N':
  58.            options.c_cflag &= ~PARENB;    /* Clear parity enable */
  59.            options.c_iflag &= ~INPCK;    /* Enable parity checking */
  60.            options.c_iflag &= ~(ICRNL|IGNCR);
  61.                    options.c_lflag &= ~(ICANON );
  62.                    break;

  63.     case 'o':
  64.     case 'O':
  65.             options.c_cflag |= (PARODD | PARENB);
  66.             options.c_iflag |= INPCK;    /* Disnable parity checking */
  67.             break;

  68.     case 'e':
  69.     case 'E':
  70.             options.c_cflag |= PARENB;    /* Enable parity */
  71.             options.c_cflag &= ~PARODD;
  72.             options.c_iflag |= INPCK;    /* Disnable parity checking */
  73.             break;

  74.     case 'S':
  75.     case 's':  /*as no parity*/
  76.             options.c_cflag &= ~PARENB;
  77.             options.c_cflag &= ~CSTOPB;
  78.             break;
  79.     default:
  80.             fprintf(stderr,"Unsupported parity\n");
  81.             return (FALSE);
  82.     }

  83.    //设置停止位
  84.    switch(stopbits){
  85.    case 1:
  86.         options.c_cflag &= ~CSTOPB;
  87.             break;
  88.    case 2:
  89.             options.c_cflag |= CSTOPB;
  90.             break;
  91.    default:
  92.         fprintf(stderr,"Unsupported stop bits\n");
  93.             return (FALSE);
  94.     }

  95.    /* Set input parity option */
  96.    if(parity != 'n')
  97.                    options.c_iflag |= INPCK;
  98.         options.c_cc[VTIME] = 150; // 15 seconds
  99.         options.c_cc[VMIN] = 0;
  100.         tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */

  101.     if(tcsetattr(fd,TCSANOW,&options) != 0){
  102.           perror("SetupSerial 3");
  103.         return (FALSE);
  104.     }
  105.     return (TRUE);
  106. }

  107. //打开串口
  108. int openDev(char *Dev)
  109. {
  110.     int  fd = open(Dev,O_RDWR);
  111.     if(-1 == fd){
  112.         perror("cat't open serial port");
  113.         return -1;
  114.     } else
  115.         return fd;
  116. }

  117. static void changestr(char *str, char *out_str)
  118. {
  119.     int i = 0, j = 0;
  120.     while((str[i++]) && (i <= 1024)){
  121.          if(str[i-1] == ',')
  122.                out_str[j] = ' ';
  123.         else
  124.              out_str[j] =str[i-1];
  125.         j++;
  126.     }
  127. }


  128. int main(int argc,char **argv)
  129. {

  130.     int fd;
  131.     int nread;
  132.     char buff[512];
  133.     char *dev = "/dev/ttyS4";
  134.     char write_info[1024];
  135.     char write_ch[256];
  136.    
  137.     fd = openDev(dev);//根据设备节点,打开相应的uart口
  138.     if(fd > 0){
  139.       set_speed(fd,115200);
  140.     } else {
  141.       printf("can't open serial port!\n");
  142.       exit(0);
  143.     }

  144.     if(set_Parity(fd,8,1,'N') == FALSE) {
  145.                 printf("set parity error\n");
  146.                 exit(1);
  147.     }

  148.     while(1){
  149.             while((nread = read(fd,&buff,512))>0){ //读测试
  150.                         printf("\nLen %d\n",nread);
  151.                         buff[nread + 1] = '\0';
  152.                     printf("%s\n",buff);
  153.                 }
  154.     }
  155.     close(fd);
  156.     exit(0);
  157. }
复制代码
3.测试方法如下:
a.首先记得要插好串口线,在板子插UART4-RX,UART-TX,GND三根线后USB端连Win7电脑,Win7电脑安装使用串口工具SSCOM3.3版本,输入数据,鼠标点击发送,空白框会出现发送成功的数据,而不是你自以为的板子发回来的数据。并且出现最底下会有S:18   | R:18   反正是S-send  R-receiver   
root@cubieboard4:~/uart# gcc -o uart_a80 uart_a80.c                             
root@cubieboard4:~/uart# ./uart_a80
set speed!             //初始化打印

Len 18                  //显示发送数据长度
this is a uart_a80 //打印发送的数据
b.

CC-A80板子终端显示

CC-A80板子终端显示

sscom输入数据

sscom输入数据

以上显示效果操作如下:
注意设置程序定的波特率115200
(1)scan:  abc
点发送
(2)scan:  qwer
点发送
(3)scan: 1223jkh32
点发送




回复

使用道具 举报

 楼主| 发表于 2015-11-10 20:20:35 | 显示全部楼层
本帖最后由 简单侶途  于 2015-11-10 20:31 编辑

今天发现一个错误,串口发送回显是程序出现了问题
参考网上的“串口避免回显“这个解决了问题
在我帖子上面的基础上,在73行修改为以下

  1.                    options.c_lflag &= ~(ICANON| ECHO | ECHOE | ISIG );
  2.                   
复制代码
1.板子先验证可以发到PC串口助手软件
1.png
uarta.png

2.接着PC用串口发送数据给板子,板子成功收到数据,空白框依旧空白。
uart2.png

回复 支持 反对

使用道具 举报

发表于 2016-8-5 21:44:39 | 显示全部楼层
简单侶途  发表于 2015-11-10 20:20
今天发现一个错误,串口发送回显是程序出现了问题
参考网上的“串口避免回显“这个解决了问题
在我帖子上面 ...

请问大神,在进行写测试的时候,为什么板子向串口发的数据不能显示在串口调试助手上啊?或者是没有发送成功吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-4-29 01:07 , Processed in 0.026333 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部