天嵌 ARM开发社区

 找回密码
 注册
查看: 3450|回复: 12

QT4 串口接收出现错误 求救

[复制链接]
vvb9137 发表于 2012-2-26 01:30:29 | 显示全部楼层 |阅读模式
写了个QT4 的串口程序   烧到开发板上发送十六进制数据 ef 01 ff ff ff ff 01 00 03 1d 00 21    PC上正常接收!
可是要是从PC发送ef 01 ff ff ff ff 01 00 03 1d 00 21   开发板上却接收到6f 01 7f 7f 7f 7f 01 03 1d 00 21    !   更奇怪的是,我在PC的linux上运行这个程序的话貌似是正常的。请问这是怎么回事呢??  有人遇过这样的问题吗?   
TQ-lkp 发表于 2012-2-26 09:48:05 | 显示全部楼层
建议楼主下载我们提供的QT4串口源码看下
回复

使用道具 举报

张海进0911 发表于 2012-3-6 18:33:34 | 显示全部楼层
我也遇到这样的问题,请问楼主解决这个问题了吗?
回复

使用道具 举报

孙小北 发表于 2012-4-3 10:51:36 | 显示全部楼层
楼主能发下你的Qt程序嘛?多谢了啊。。。。我不懂read怎么调用啊!!798567902@qq.com:loveliness:
回复

使用道具 举报

fl753914075 发表于 2012-4-23 20:33:43 | 显示全部楼层
不知道楼主的问题解决了没,我也遇到了这个问题,是自带的串口程序有问题
回复

使用道具 举报

 楼主| vvb9137 发表于 2012-4-23 23:49:02 | 显示全部楼层
fl753914075 发表于 2012-4-23 20:33
不知道楼主的问题解决了没,我也遇到了这个问题,是自带的串口程序有问题

我不记得怎么解决的了!  你按照天嵌给的去设置就可以,问题应该出在write 和read     或许你可以把代码发出来,让其他大虾们帮你解决!  
回复

使用道具 举报

 楼主| vvb9137 发表于 2012-4-23 23:49:40 | 显示全部楼层
孙小北 发表于 2012-4-3 10:51
楼主能发下你的Qt程序嘛?多谢了啊。。。。我不懂read怎么调用啊!!

额。。。貌似我一直没看到你的回复...不好意思  不需要了吧?
回复

使用道具 举报

 楼主| vvb9137 发表于 2012-4-23 23:50:38 | 显示全部楼层
张海进0911 发表于 2012-3-6 18:33
我也遇到这样的问题,请问楼主解决这个问题了吗?

为什么我一直没有发现这个贴有人回复呢......
回复

使用道具 举报

北夜星辰 发表于 2012-5-6 19:38:25 | 显示全部楼层
楼主你好,你的程序能发给我看下嘛?谢谢啦,我已经纠结了好久了,就是搞不出write()函数怎么调用,无论怎样PC机就是收不到板子发出的数据。
我的邮箱894688950@qq.com。感谢感谢~
回复

使用道具 举报

 楼主| vvb9137 发表于 2012-5-6 23:31:04 | 显示全部楼层
北夜星辰 发表于 2012-5-6 19:38
楼主你好,你的程序能发给我看下嘛?谢谢啦,我已经纠结了好久了,就是搞不出write()函数怎么调用,无论怎样 ...
  1. struct serial_config serialread;

  2. static int serial_fd,beep_fd;

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

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


  7. MainWindow::MainWindow(QWidget *parent) :
  8.     QMainWindow(parent),
  9.     ui(new Ui::MainWindow)
  10. {
  11.   //  root=0;
  12.     ui->setupUi(this);
  13.     serial_init();

  14.     creatData(); //创建数据库文件


  15.     root=0;
  16. }

  17. MainWindow::~MainWindow()
  18. {
  19.     delete ui;
  20. }

  21. void MainWindow::changeEvent(QEvent *e)
  22. {
  23.     QMainWindow::changeEvent(e);
  24.     switch (e->type()) {
  25.     case QEvent::LanguageChange:
  26.         ui->retranslateUi(this);
  27.         break;
  28.     default:
  29.         break;
  30.     }
  31. }

  32. //-----------------------------------------------
  33. //读取tq2440_serial.cfg文件并进行配置
  34. //-----------------------------------------------
  35. void MainWindow::readserialcfg()
  36. {
  37.         FILE *serial_fp;
  38.         char j[10];

  39.         printf("readserailcfg\n");

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

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

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

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

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

  57.         fclose(serial_fp);
  58. }

  59. //-----------------------------------------------
  60. //设置波特率
  61. //-----------------------------------------------
  62. void MainWindow::set_speed(int fd)
  63. {
  64.         int i;
  65.         int status;
  66.         struct termios Opt;
  67.         struct termios oldOpt;
  68.         tcgetattr(fd, &oldOpt);
  69. //        tcgetattr(fd, &Opt);
  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 MainWindow::set_Parity(int fd)
  92. {
  93.         struct termios options;
  94.         struct termios oldoptions;
  95.         if(tcgetattr(fd, &oldoptions) != 0)
  96. //        if(tcgetattr(fd, &options) != 0)
  97.         {
  98.                 perror("SetupSerial 1");
  99.                 return(FALSE);
  100.         }

  101.         options.c_cflag |= (CLOCAL|CREAD);
  102.         options.c_cflag &=~CSIZE;

  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.         switch(serialread.parity)
  117.         {
  118.                 case 'n':
  119.                 case 'N':
  120.                         options.c_cflag &= ~PARENB;
  121.                         options.c_iflag &= ~INPCK;
  122.                         break;
  123.                 case 'o':
  124.                 case 'O':
  125.                         options.c_cflag |= (PARODD | PARENB);
  126.                         options.c_iflag |= INPCK;
  127.                         break;
  128.                 case 'e':
  129.                 case 'E':
  130.                         options.c_cflag |= PARENB;
  131.                         options.c_cflag &= ~PARODD;
  132.                         options.c_iflag |= INPCK;
  133.                         break;
  134.                 default:
  135.                         options.c_cflag &= ~PARENB;
  136.                         options.c_iflag &= ~INPCK;
  137.                         fprintf(stderr, "Unsupported parity\n");
  138.                         return(FALSE);
  139.         }

  140.         switch(serialread.stopbits)
  141.         {
  142.                 case 1:
  143.                         options.c_cflag &= ~CSTOPB;
  144.                         break;
  145.                 case 2:
  146.                         options.c_cflag |= CSTOPB;
  147.                         break;
  148.                 default:
  149.                         options.c_cflag &= ~CSTOPB;
  150.                         fprintf(stderr, "Unsupported stop bits\n");
  151.                         return(FALSE);
  152.         }
  153.         if(serialread.parity != 'n')
  154.                 options.c_iflag |= INPCK;
  155.         options.c_cc[VTIME] = 0;        //150;                        //15 seconds
  156.         options.c_cc[VMIN] = 0;
  157. #if 1
  158.         options.c_iflag |= IGNPAR|ICRNL;
  159.         options.c_oflag |= OPOST;
  160.         options.c_iflag &= ~(IXON|IXOFF|IXANY);
  161. #endif
  162.         tcflush(fd, TCIFLUSH);
  163.         if(tcsetattr(fd, TCSANOW, &options) != 0)
  164.         {
  165.             //    perror("SetupSerial 3");
  166.                 return(FALSE);
  167.         }
  168.         return(TRUE);
  169. }

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

  184. //--------------------------------------------------
  185. //串口初始化
  186. //--------------------------------------------------
  187. void MainWindow::serial_init(void)
  188. {
  189.         char *Dev;


  190.         readserialcfg();

  191.         Dev = serialread.serial_dev;
  192.         //打开串口设备
  193.         serial_fd = OpenDev(Dev);

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

  222. }


  223. char SFG_Identify[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x11,0x00,0x15};

  224.              write(serial_fd,SFG_Identify,sizeof(SFG_Identify));
复制代码
回复

使用道具 举报

 楼主| vvb9137 发表于 2012-5-6 23:32:08 | 显示全部楼层
vvb9137 发表于 2012-5-6 23:31

整个程序很多东西,太乱了   就看这一段吧!  
回复

使用道具 举报

北夜星辰 发表于 2012-5-7 11:02:08 | 显示全部楼层
vvb9137 发表于 2012-5-6 23:32
整个程序很多东西,太乱了   就看这一段吧!

写楼主了,不过让串口向PC机发送数据的是哪一条指令呢?
最后一行的write函数就能让开发板发送数据?
回复

使用道具 举报

 楼主| vvb9137 发表于 2012-5-7 13:02:57 | 显示全部楼层
北夜星辰 发表于 2012-5-7 11:02
写楼主了,不过让串口向PC机发送数据的是哪一条指令呢?
最后一行的write函数就能让开发板发送数据?

嗯 ,对 忘了说最后两行就是发数据                       
char SFG_Identify[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x11,0x00,0x15};
write(serial_fd,SFG_Identify,sizeof(SFG_Identify));
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-6-20 04:03 , Processed in 2.060959 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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