简单侶途  发表于 2015-11-9 21:10:38

CC-A80 串口测试演示

本帖最后由 简单侶途  于 2015-11-9 21:16 编辑

1.最近很多人在CC-A80平台上遇到很多奇怪的串口问题,今天亲生经历了一遍,调试代码,终于成功出现效果。
下面是我找到的参考资料,要注意的是官方资料里面代码有误,正确代码我会给出,请大家对比参考。

2.修改后代码如下:#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>//必须包含此头文件
#include <errno.h>

#define FALSE 0
#define TRUE1

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

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

void set_speed(int fd, int speed)
{
int i;
int status;
struct termios opt;

tcgetattr(fd,&opt);

for (i= 0;i<sizeof(speed_arr)/sizeof(int);i++){
      if(speed == name_arr){
                printf("set speed!\n");
               tcflush(fd, TCIOFLUSH);
                     cfsetispeed(&opt, speed_arr);
               cfsetospeed(&opt, speed_arr);
                status = tcsetattr(fd, TCSANOW, &opt);

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

                     return;
         }
         printf("no set speed!\n");
         tcflush(fd,TCIOFLUSH);
   }
}

int set_Parity(int fd,int databits,int stopbits,int parity)
{
   struct termios options;
   if( tcgetattr( fd,&options)!= 0){
         perror("SetupSerial 1");
      return(FALSE);
   }

   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 (FALSE);
    }

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

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

    case 'e':
    case 'E':
            options.c_cflag |= PARENB;    /* Enable parity */
            options.c_cflag &= ~PARODD;
            options.c_iflag |= INPCK;    /* Disnable 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 (FALSE);
    }

   //设置停止位
   switch(stopbits){
   case 1:
      options.c_cflag &= ~CSTOPB;
            break;
   case 2:
            options.c_cflag |= CSTOPB;
            break;
   default:
      fprintf(stderr,"Unsupported stop bits\n");
            return (FALSE);
    }

   /* Set input parity option */
   if(parity != 'n')
                   options.c_iflag |= INPCK;
      options.c_cc = 150; // 15 seconds
      options.c_cc = 0;
      tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */

    if(tcsetattr(fd,TCSANOW,&options) != 0){
          perror("SetupSerial 3");
      return (FALSE);
    }
    return (TRUE);
}

//打开串口
int openDev(char *Dev)
{
    intfd = open(Dev,O_RDWR);
    if(-1 == fd){
      perror("cat't open serial port");
      return -1;
    } else
      return fd;
}

static void changestr(char *str, char *out_str)
{
    int i = 0, j = 0;
    while((str) && (i <= 1024)){
         if(str == ',')
               out_str = ' ';
      else
             out_str =str;
      j++;
    }
}


int main(int argc,char **argv)
{

    int fd;
    int nread;
    char buff;
    char *dev = "/dev/ttyS4";
    char write_info;
    char write_ch;
   
    fd = openDev(dev);//根据设备节点,打开相应的uart口
    if(fd > 0){
      set_speed(fd,115200);
    } else {
      printf("can't open serial port!\n");
      exit(0);
    }

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

    while(1){
            while((nread = read(fd,&buff,512))>0){ //读测试
                        printf("\nLen %d\n",nread);
                        buff = '\0';
                  printf("%s\n",buff);
                }
    }
    close(fd);
    exit(0);
}
3.测试方法如下:
a.首先记得要插好串口线,在板子插UART4-RX,UART-TX,GND三根线后USB端连Win7电脑,Win7电脑安装使用串口工具SSCOM3.3版本,输入数据,鼠标点击发送,空白框会出现发送成功的数据,而不是你自以为的板子发回来的数据。并且出现最底下会有S:18   | R:18   反正是S-sendR-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.


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




简单侶途  发表于 2015-11-10 20:20:35

本帖最后由 简单侶途  于 2015-11-10 20:31 编辑

今天发现一个错误,串口发送回显是程序出现了问题
参考网上的“串口避免回显“这个解决了问题
在我帖子上面的基础上,在73行修改为以下
                   options.c_lflag &= ~(ICANON| ECHO | ECHOE | ISIG );
                  
1.板子先验证可以发到PC串口助手软件



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


ywk112330 发表于 2016-8-5 21:44:39

简单侶途  发表于 2015-11-10 20:20 static/image/common/back.gif
今天发现一个错误,串口发送回显是程序出现了问题
参考网上的“串口避免回显“这个解决了问题
在我帖子上面 ...

请问大神,在进行写测试的时候,为什么板子向串口发的数据不能显示在串口调试助手上啊?或者是没有发送成功吗?
页: [1]
查看完整版本: CC-A80 串口测试演示