天嵌 ARM开发社区

 找回密码
 注册
查看: 1681|回复: 3

急!!!!!!TQ2440 linux下使用串口扩展模块循环读取数据失败

[复制链接]
1009789368 发表于 2013-3-29 02:45:20 | 显示全部楼层 |阅读模式
我现在在做一个CC2430通信实验。两个CC2430分别连上PC机,使用串口调试助手完全正常。
但是若是我用一个CC2430连上PC机,串口助手自动写入数据发送,
然后另外一个CC2430连上TQ2440的串口扩展模块的COM3口,如此做通信实验时,出现一个现象:
TQ2440写串口数据,PC机端串口助手显示另外一个CC2430接收正常,但是TQ2440反复读取数据时,只能读取几次数据而已(read函数此后返回的字节数都是0)。下面是代码,望各位大侠帮忙解决,急!!!!!
  1. serial_test.h
  2. #define FALSE                0
  3. #define TRUE                1

  4. #define WORDLEN                32                //其他名称长度32字节(16个汉字)

  5. struct serial_config
  6. {
  7.         unsigned char serial_dev[WORDLEN];
  8.         unsigned int serial_speed;
  9.         unsigned char databits;
  10.         unsigned char stopbits;
  11.         unsigned char parity;
  12. };
复制代码
  1. serial_test.c
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <termios.h>
  6. #include <errno.h>
  7. #include <ctype.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <time.h>
  12. #include <unistd.h>
  13. #include"pthread.h"

  14. #include "serial_test.h"


  15. struct serial_config serialread;

  16. static int serial_fd,beep_fd;

  17. int speed_arr[] = {B230400, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  18.                    B38400, B19200, B9600, B4800, B2400, B1200, B300};

  19. int name_arr[] = {230400, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,
  20.                   38400, 19200, 9600, 4800, 2400, 1200, 300};

  21. //-----------------------------------------------
  22. //打印配置文件tq2440_serial.cfg的内容
  23. //-----------------------------------------------
  24. void print_serialread()
  25. {
  26.         printf("serialread.dev is %s\n",serialread.serial_dev);
  27.         printf("serialread.speed is %d\n",serialread.serial_speed);
  28.         printf("serialread.databits is %d\n",serialread.databits);
  29.         printf("serialread.stopbits is %d\n",serialread.stopbits);
  30.         printf("serialread.parity is %c\n",serialread.parity);
  31. }

  32. //-----------------------------------------------
  33. //读取tq2440_serial.cfg文件并进行配置
  34. //-----------------------------------------------
  35. void readserialcfg()
  36. {
  37.         FILE *serial_fp;
  38.         char j[10];
  39.        
  40.         printf("readserailcfg\n");

  41.         serial_fp = fopen("/etc/tq2440_serial.cfg","r");
  42.         if(NULL == serial_fp)
  43.         {
  44.                 printf("can't open /etc/tq2440_serial.cfg");
  45.         }
  46.         else
  47.         {
  48.                 fscanf(serial_fp, "DEV=%s\n", serialread.serial_dev);

  49.                 fscanf(serial_fp, "SPEED=%s\n", j);
  50.                 serialread.serial_speed = atoi(j);

  51.                 fscanf(serial_fp, "DATABITS=%s\n", j);
  52.                 serialread.databits = atoi(j);

  53.                 fscanf(serial_fp, "STOPBITS=%s\n", j);
  54.                 serialread.stopbits = atoi(j);

  55.                 fscanf(serial_fp, "PARITY=%s\n", j);
  56.                 serialread.parity = j[0];
  57.         }

  58.         fclose(serial_fp);
  59. }

  60. //-----------------------------------------------
  61. //设置波特率
  62. //-----------------------------------------------
  63. void set_speed(int fd)
  64. {
  65.         int i;
  66.         int status;
  67.         struct termios Opt;
  68.         struct termios oldOpt;
  69.         tcgetattr(fd, &oldOpt);
  70. //        printf("serialread.speed is %d\n",serialread.serial_speed);
  71.         for( i = 0; i < sizeof(speed_arr)/sizeof(int); i++)
  72.         {
  73.                 if(serialread.serial_speed == name_arr[i])
  74.                 {
  75.                         tcflush(fd, TCIOFLUSH);
  76.                         cfsetispeed(&Opt, speed_arr[i]);
  77.                         cfsetospeed(&Opt, speed_arr[i]);
  78.                         status = tcsetattr(fd, TCSANOW, &Opt);
  79.                         if(status != 0)
  80.                         {
  81.                                 perror("tcsetattr fd1");
  82.                                 return;
  83.                         }
  84.                         tcflush(fd, TCIOFLUSH);
  85.                 }
  86.         }
  87. }


  88. //-----------------------------------------------
  89. //设置其他参数
  90. //-----------------------------------------------
  91. int set_Parity(int fd)
  92. {
  93.         struct termios options;
  94.         struct termios oldoptions;
  95.         if(tcgetattr(fd, &oldoptions) != 0)
  96.         {
  97.                 perror("SetupSerial 1");
  98.                 return(FALSE);
  99.         }

  100.         options.c_cflag |= (CLOCAL|CREAD);
  101.         options.c_cflag &=~CSIZE;
  102. //        printf("serialread.databits is %d\n",serialread.databits);
  103.         switch(serialread.databits)
  104.         {
  105.                 case 7:
  106.                         options.c_cflag |= CS7;
  107.                         break;
  108.                 case 8:
  109.                         options.c_cflag |= CS8;
  110.                         break;
  111.                 default:
  112.                         options.c_cflag |= CS8;
  113.                         fprintf(stderr, "Unsupported data size\n");
  114.                         return(FALSE);
  115.         }
  116. //        printf("serialread.parity is %c\n",serialread.parity);
  117.         switch(serialread.parity)
  118.         {
  119.                 case 'n':
  120.                 case 'N':
  121.                         options.c_cflag &= ~PARENB;
  122.                         options.c_iflag &= ~INPCK;
  123.                         break;
  124.                 case 'o':
  125.                 case 'O':
  126.                         options.c_cflag |= (PARODD | PARENB);
  127.                         options.c_iflag |= INPCK;
  128.                         break;
  129.                 case 'e':
  130.                 case 'E':
  131.                         options.c_cflag |= PARENB;
  132.                         options.c_cflag &= ~PARODD;
  133.                         options.c_iflag |= INPCK;
  134.                         break;
  135.                 default:
  136.                         options.c_cflag &= ~PARENB;
  137.                         options.c_iflag &= ~INPCK;
  138.                         fprintf(stderr, "Unsupported parity\n");
  139.                         return(FALSE);
  140.         }
  141. //        printf("serialread.stopbits is %d\n",serialread.stopbits);
  142.         switch(serialread.stopbits)
  143.         {
  144.                 case 1:
  145.                         options.c_cflag &= ~CSTOPB;
  146.                         break;
  147.                 case 2:
  148.                         options.c_cflag |= CSTOPB;
  149.                         break;
  150.                 default:
  151.                         options.c_cflag &= ~CSTOPB;
  152.                         fprintf(stderr, "Unsupported stop bits\n");
  153.                         return(FALSE);
  154.         }
  155.         if(serialread.parity != 'n')
  156.                 options.c_iflag |= INPCK;
  157.         options.c_cc[VTIME] = 150;        //150;                        //15 seconds
  158.         options.c_cc[VMIN] = 0;
  159. #if 1
  160.         options.c_iflag |= IGNPAR|ICRNL;
  161.         options.c_oflag |= OPOST;
  162.         //options.c_iflag &= ~(IXON|IXOFF|IXANY);                     
  163.         options.c_iflag |= IXOFF|IXON;
  164. #endif
  165.         tcflush(fd, TCIFLUSH);
  166.         if(tcsetattr(fd, TCSANOW, &options) != 0)
  167.         {
  168.                 perror("SetupSerial 3");
  169.                 return(FALSE);
  170.         }
  171.         return(TRUE);
  172. }

  173. //-----------------------------------------------
  174. //打开串口设备
  175. //-----------------------------------------------
  176. int OpenDev(char *Dev)
  177. {
  178.         int fd = open(Dev, O_RDWR);
  179.         if(-1 == fd)
  180.         {
  181.                 perror("Can't Open Serial Port");
  182.                 return -1;
  183.         }
  184.         else
  185.                 return fd;
  186. }

  187. //--------------------------------------------------
  188. //串口初始化
  189. //--------------------------------------------------
  190. void serial_init(void)
  191. {
  192.         char *Dev;

  193.         int i;

  194.         readserialcfg();
  195.         print_serialread();

  196.         Dev = serialread.serial_dev;
  197.         //打开串口设备
  198.         serial_fd = OpenDev(Dev);

  199.         if(serial_fd > 0)
  200.                 set_speed(serial_fd);                //设置波特率
  201.         else
  202.         {
  203.                 printf("Can't Open Serial Port!\n");
  204.                 exit(0);
  205.         }
  206.         //恢复串口未阻塞状态
  207.         /*if(fcntl(serial_fd,F_SETFL,0)<0)        */
  208.         if (fcntl(serial_fd, F_SETFL, fcntl(serial_fd,F_GETFL,0) | O_NONBLOCK) < 0)
  209.         {
  210.                 printf("fcntl failed!\n");
  211.                 exit(0);
  212.         }
  213.         //检查是否是终端设备
  214. #if 1        //如果屏蔽下面这段代码,在串口输入时不会有回显的情况,调用下面这段代码时会出现回显现象。
  215.         if(isatty(STDIN_FILENO)==0)
  216.         {
  217.                 printf("standard input is not a terminal device\n");
  218.         }
  219.         else
  220.                 printf("isatty success!\n");
  221. #endif
  222.         //设置串口参数
  223.         if(set_Parity(serial_fd) == FALSE)
  224.         {
  225.                 printf("Set parity Error\n");
  226.                 exit(1);
  227.         }

  228. }

  229. int read_data(int fd, void *buf, int len)
  230. {
  231.     int count;
  232.     int ret;

  233.     ret = 0;
  234.     count = 0;

  235.     //while (len > 0) {


  236.     ret = read(fd, (char*)buf + count, len);
  237.     if (ret < 0) {
  238.         fprintf(stderr, "Read error %s\n", strerror(errno));
  239.         //break;

  240.     }

  241.     count += ret;
  242.     len = len - ret;

  243.     //}


  244.     *((char*)buf + count) = 0;
  245.     return count;
  246. }


  247. int write_data(int fd, void *buf, int len)
  248. {
  249.     int count;
  250.     int ret;

  251.     ret = 0;
  252.     count = 0;

  253.     while (len > 0) {

  254.         ret = write(fd, (char*)buf + count, len);
  255.         if (ret < 1) {
  256.             fprintf(stderr, "Write error %s\n", strerror(errno));
  257.             break;
  258.         }

  259.         count += ret;
  260.         len = len - ret;
  261.     }

  262.     return count;
  263. }

  264. void serial_rw()
  265. {
  266.         int i=0;
  267.         char buff[512];
  268.         char buff2[]="hello,TQ2440!\n";
  269.         int nread,nwrite;
  270.         struct timeval tv;
  271.         fd_set rfds;
  272.        
  273.         tv.tv_sec=0;
  274.         tv.tv_usec=30;
  275.        
  276.         nwrite=write_data(serial_fd,buff2,sizeof(buff2));
  277.         printf("nwrite=%d\n",nwrite);
  278.         while(1){
  279.                 printf("waiting........!\n");
  280.                 /*if (fcntl(serial_fd, F_SETFL, fcntl(serial_fd,F_GETFL,0) | O_NONBLOCK) < 0)
  281.                 {
  282.                         printf("fcntl failed!\n");
  283.                         exit(0);
  284.                 }
  285.                 nread=read_data(serial_fd,buff,50);
  286.                 printf("readlength=%d\n",nread);
  287.                 buff[nread]='\0';
  288.                 printf("%s\n",buff);
  289.                 sleep(2);*/
  290.                
  291.                 FD_ZERO(&rfds);
  292.                 FD_SET(serial_fd,&rfds);
  293.                 if(select(serial_fd+1,&rfds,NULL,NULL,&tv)>0)
  294.                 {
  295.                         printf("enter select()!\n");
  296.                         if(FD_ISSET(serial_fd,&rfds))
  297.                         {
  298.                                 printf("reading!\n");
  299.                                 nread=read_data(serial_fd,buff,10);
  300.                                 printf("readlength=%d\n",nread);
  301.                        
  302.                                 printf("i=%d\n",++i);
  303.                                 buff[nread]='\0';
  304.                                 printf("%s\n",buff);
  305.                                 memset(buff,'\0',sizeof(buff));
  306.                                 //tcflush(serial_fd, TCIFLUSH);
  307.                         }
  308.                
  309.                 }
  310.                 sleep(2);               
  311.                
  312.         }
  313.         close(serial_fd);

  314. }

  315. int main(int argc, char **argv)
  316. {
  317.         serial_init();
  318.         serial_rw();       
  319.         return 0;
  320. //        close(serialread.serial_dev);
  321. //        serial_test(telnum, telmoney);
  322. }
复制代码
如下是运行效果:
readserailcfg
serialread.dev is /dev/tq2440_serial2
serialread.speed is 38400
serialread.databits is 8
serialread.stopbits is 1
serialread.parity is N
isatty success!
nwrite=15
waiting........!
waiting........!
enter select()!
reading!
readlength=128
i=1
98745698745698745698745698745698745698745698745698745698745698745698745698745698745698745698745698745698745698745698745698745698
waiting........!
waiting........!
waiting........!
waiting........!
 楼主| 1009789368 发表于 2013-3-29 14:38:02 | 显示全部楼层
怎么没有人回复啊!!!!!
TQ-lkp 发表于 2013-3-29 18:08:51 | 显示全部楼层
tv.tv_sec=0;
        tv.tv_usec=30;
你把这个超时加长些看看
 楼主| 1009789368 发表于 2013-3-29 19:48:17 | 显示全部楼层
这样也没有用!我试过的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-6-29 03:58 , Processed in 1.125000 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表