免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7901 | 回复: 7
打印 上一主题 下一主题

串口读不到数据问题?(很紧急!!) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-09 09:47 |只看该作者 |倒序浏览
20可用积分
用GPRS做开发,写好程序后放到arm板子上跑,打电话的功能都能实现,就是收不到任何信息,别人打电话给我,或是发短信给我,我收不到任何数据
调试了好久没弄好,我实在没办法了,这个项目要交了,各位大哥,朋友帮帮忙啊!
    串口问题:能发信息,收不到信息.


    我直接贴我串口的代码,大家看看那里有问题!

   #include "serial.h"

MySerial::MySerial( )
{
}

MySerial::~MySerial()
{

}
//这里是设置串口参数
int MySerial::set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
        struct termios newtio,oldtio;
        if  ( tcgetattr( fd,&oldtio)  !=  0) {
                perror("SetupSerial 1";
                return -1;
        }
        bzero( &newtio, sizeof( newtio ) );
        newtio.c_cflag  |=  CLOCAL | CREAD;
        newtio.c_cflag &= ~CSIZE;
//        newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
//        newtio.c_oflag &= ~OPOST;
        switch( nBits )
        {
        case 7:
                newtio.c_cflag |= CS7;
                break;
        case 8:
                newtio.c_cflag |= CS8;
                break;
        }

        switch( nEvent )
        {
        case 'O':
                newtio.c_cflag |= PARENB;
                newtio.c_cflag |= PARODD;
                newtio.c_iflag |= (INPCK | ISTRIP);
                break;
        case 'E':
                newtio.c_iflag |= (INPCK | ISTRIP);
                newtio.c_cflag |= PARENB;
                newtio.c_cflag &= ~PARODD;
                break;
        case 'N':
                newtio.c_cflag &= ~PARENB;
                break;
        }

        switch( nSpeed )
        {
        case 2400:
                cfsetispeed(&newtio, B2400);
                cfsetospeed(&newtio, B2400);
                break;
        case 4800:
                cfsetispeed(&newtio, B4800);
                cfsetospeed(&newtio, B4800);
                break;
        case 9600:
                cfsetispeed(&newtio, B9600);
                cfsetospeed(&newtio, B9600);
                break;
        case 115200:
                cfsetispeed(&newtio, B115200);
                cfsetospeed(&newtio, B115200);
                break;
        default:
                cfsetispeed(&newtio, B9600);
                cfsetospeed(&newtio, B9600);
                break;
        }
        if( nStop == 1 )
                newtio.c_cflag &=  ~CSTOPB;
        else if ( nStop == 2 )
        newtio.c_cflag |=  CSTOPB;
        newtio.c_cc[VTIME]  = 0;
        newtio.c_cc[VMIN] = 0;
        tcflush(fd,TCIFLUSH);
        if((tcsetattr(fd,TCSANOW,&newtio))!=0)
        {
                perror("com set error";
                return -1;
        }
        return 0;
}
//这里是打开串口
int MySerial:pen_port(int fd,int comport)
{
        if (comport==1)
        {        fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
                if (-1 == fd){
                        perror("Can't Open Serial /dev/ttyS0 Port";
                        return(-1);
                }
        }
        else if(comport==2)
        {        fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
                if (-1 == fd){
                        perror("Can't Open Serial /dev/ttyS1 Port";
                        return(-1);
                }
        }
        else if (comport==3)
        {
                fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);
                if (-1 == fd){
                        perror("Can't Open Serial /dev/ttyS2 Port";
                        return(-1);
                }
        }
        if(fcntl(fd, F_SETFL, 0)<0)
                perror("fcntl failed!";
        if(isatty(STDIN_FILENO)==0)
                perror("standard input is not a terminal device";
        return fd;
}


大家看看上面那里有问题,
我是这个样子读数据的
if(read(fd,buff,sizeof(buff))!=0)
{
  .......
}


大家帮帮忙啊,谢谢!分不够的话我再送啊!

最佳答案

查看完整内容

肯定好使不过我这个程序有bug仅供参考直接把分给我吧

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
2 [报告]
发表于 2009-12-09 09:47 |只看该作者
原帖由 hacktao 于 2009-12-9 10:32 发表
谢谢T-Bagwell !我看看这个程序!


肯定好使
不过我这个程序有bug
仅供参考
直接把分给我吧

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
3 [报告]
发表于 2009-12-09 10:00 |只看该作者
每次读串口数据的时候最好间隔一小段时间,因为串口数据传输肯定没有咱们的程序的指令跑的快

论坛徽章:
0
4 [报告]
发表于 2009-12-09 10:17 |只看该作者

回复 #2 T-Bagwell 的帖子

我用了一个定时器,
定时一段时间读取一次。
qt程序:

TimerRead = new QTimer;

TimerRead->start(200);
QObject::connect( TimerRead, SIGNAL(timeout()), this, SLOT(read_timeout_slot()) );  //read_timeout_slot里面包含了read的函数。

然后我在read_timeout_slot
里这样写的:
void MainWindow::read_timeout_slot()

     TimerRead->stop();
。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。

  if(read(fd,buff,sizeof(buff))!=0)
{
  .......
}
。。。。。。。。。。。。。。。。。。

     TimerRead->start(200);

我觉得是不是自己的串口程序写的不好,写都可以,读确不行,想不明白~~

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
5 [报告]
发表于 2009-12-09 10:27 |只看该作者

  1. int set_sms_text_mode()
  2. {
  3.         int ret=0;
  4.         int i;
  5.         char *send_buf,recv_buf[BUFFER_SIZE];

  6.         send_buf="AT+CMGF=1\r\0";

  7.         for (i=0;i<RETRY;i++)
  8.         {
  9.                 usleep(5000);
  10.                 ret=serial_recv(send_buf,strlen(send_buf),recv_buf,5,0,1,0);
  11.                 if (ret<0)
  12.                 {
  13.                         printf("AT+CMGF:SERIAL SEND AND RECEIVE ERROR!\n");
  14.                         return SETSMSTEXTMODE_ERR;
  15.                 }
  16.                 else
  17.                 {
  18.                         if (check_OK(recv_buf,ret)==0)
  19.                                 return 0;
  20.                 }
  21.         }
  22.         return SETSMSTEXTMODE_ERR;
  23. }

  24. int sms_send (unsigned char *sms_des,unsigned char *sms_content)
  25. {
  26.         int ret=0;
  27.         int i;
  28.         char send_buf[BUFFER_SIZE],recv_buf[BUFFER_SIZE],content_buf[BUFFER_SIZE];
  29.         char *des_head="AT+CMGS=";
  30.         char *des_tail="\r\0";
  31.         char content_tail[2]={0x1a,0x0};

  32.         memcpy (send_buf, des_head, strlen(des_head));
  33.         memcpy (send_buf+strlen(des_head), sms_des, strlen(sms_des));
  34.         memcpy (send_buf+strlen(des_head)+strlen(sms_des),des_tail,strlen(des_tail)+1);

  35.         memcpy (content_buf,sms_content,strlen(sms_content));
  36.         memcpy (content_buf+strlen(sms_content),content_tail,strlen(content_tail)+1);

  37.         for (i=0;i<RETRY;i++)
  38.         {
  39.                 usleep(5000);
  40.                 while (serial_busy) usleep(1);
  41.                 serial_busy=1;
  42.                 ret=serial_send_recv(send_buf,strlen(send_buf),content_buf,strlen(content_buf),recv_buf,20,0,5,0);
  43.                 serial_busy=0;
  44.                 if (ret<0)
  45.                 {
  46.                         printf("AT+CMGS:SERIAL SEND AND RECEIVE ERROR!\n");
  47.                         return SMSSEND_ERR;
  48.                 }
  49.                 else
  50.                 {
  51.                         if (check_OK(recv_buf,ret)==0)
  52.                                 return 0;
  53.                 }
  54.         }
  55.         return SMSSEND_ERR;
  56. }

  57. int check_cmgl(unsigned char *recv_buf,unsigned int recv_buf_len)
  58. {
  59.         int i,j,ret;
  60.         unsigned int head=0;
  61.         unsigned int tail=0;
  62.         ret=0;
  63.         i=0;
  64.         while (i<recv_buf_len)
  65.         {
  66.                 if ((recv_buf[i]=='+')&&
  67.                         (recv_buf[i+1]=='C')&&
  68.                         (recv_buf[i+2]=='M')&&
  69.                         (recv_buf[i+3]=='G')&&
  70.                         (recv_buf[i+4]=='L')&&
  71.                         (recv_buf[i+5]==':')&&
  72.                         (recv_buf[i+6]==0x20))
  73.                 {
  74.                         head=i+7;
  75.                         for(j=head;j<recv_buf_len;j++)
  76.                         {
  77.                                 if(recv_buf[j]==',')
  78.                                 {
  79.                                         tail=j;
  80.                                         break;
  81.                                 }
  82.                         }
  83.                         memcpy (sms[ret].pos,recv_buf+head,(tail-head));
  84.                         sms[ret].pos[tail-head]='\0';
  85.                         head=tail+2;
  86.                         for(j=head;j<recv_buf_len;j++)
  87.                         {
  88.                                 if(recv_buf[j]=='"')
  89.                                 {
  90.                                         tail=j;
  91.                                         break;
  92.                                 }
  93.                         };
  94.                         memcpy (sms[ret].read_flag,recv_buf+head,(tail-head));
  95.                         sms[ret].read_flag[tail-head]='\0';
  96.                         head=tail+3;
  97.                         for(j=head;j<recv_buf_len;j++)
  98.                         {
  99.                                 if(recv_buf[j]=='"')
  100.                                 {
  101.                                         tail=j;
  102.                                         break;
  103.                                 }
  104.                         }
  105.                         memcpy (sms[ret].sms_from,recv_buf+head,(tail-head));
  106.                         sms[ret].sms_from[tail-head]='\0';
  107.                         head=tail+4;
  108.                         for (j=head;j<recv_buf_len;j++)
  109.                         {
  110.                                 if(recv_buf[j]=='"')
  111.                                 {
  112.                                         tail=j;
  113.                                         break;
  114.                                 }
  115.                         }
  116.                         memcpy (sms[ret].recv_time,recv_buf+head,(tail-head));
  117.                         sms[ret].recv_time[tail-head]='\0';
  118.                         head=tail+3;
  119.                         for (j=head;j<recv_buf_len;j++)
  120.                         {
  121.                                 if(recv_buf[j]=='\r')
  122.                                 {
  123.                                         tail=j;
  124.                                         break;
  125.                                 }
  126.                         }
  127.                         memcpy (sms[ret].sms_content,recv_buf+head,(tail-head));
  128.                         sms[ret].sms_content[tail-head]='\0';
  129.                         sms[ret].flag=1;
  130.                         i=tail;
  131.                         ret++;
  132.                 }
  133.                 else i++;
  134.         }
  135.         return ret;
  136. }
复制代码


  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. #include <string.h>

  10. #include "serial_receive.h"

  11. #define DEBUG 0

  12. void setTermios(struct termios * pNewtio, U16 uBaudRate)
  13. {
  14.         bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings */

  15.         //8N1
  16.         pNewtio->c_cflag = uBaudRate | CS8 |  CREAD | CLOCAL;
  17.         pNewtio->c_iflag = IGNPAR;
  18.                
  19.         pNewtio->c_oflag = 0;
  20.         pNewtio->c_lflag = 0; //non ICANON

  21.         pNewtio->c_cc[VINTR]    = 0;
  22.         pNewtio->c_cc[VQUIT]    = 0;
  23.         pNewtio->c_cc[VERASE]   = 0;  
  24.         pNewtio->c_cc[VKILL]    = 0;
  25.         pNewtio->c_cc[VEOF]     = 4;
  26.         pNewtio->c_cc[VTIME]    = 5;
  27.         pNewtio->c_cc[VMIN]     = 0;
  28.         pNewtio->c_cc[VSWTC]    = 0;
  29.         pNewtio->c_cc[VSTART]   = 0;
  30.         pNewtio->c_cc[VSTOP]    = 0;
  31.         pNewtio->c_cc[VSUSP]    = 0;
  32.         pNewtio->c_cc[VEOL]     = 0;
  33.         pNewtio->c_cc[VREPRINT] = 0;
  34.         pNewtio->c_cc[VDISCARD] = 0;
  35.         pNewtio->c_cc[VWERASE]  = 0;
  36.         pNewtio->c_cc[VLNEXT]   = 0;
  37.         pNewtio->c_cc[VEOL2]    = 0;
  38. }


  39. int serial_recv(char *send_buf,int send_len,char *recv_buf,int timeout_s,int timeout_us,int wait_s,int wait_us)
  40. {
  41.         int fd;
  42.         int nread=0;
  43.         int nwrite=0;
  44.         char buff[BUFSIZE];
  45.         struct termios oldtio,newtio;
  46.            struct timeval tv;
  47.         char *dev ="/dev/tts/0";
  48.         fd_set rfds;

  49.         if ( (fd = open(dev,O_RDWR | O_NOCTTY ))<0)
  50.         {
  51.                 printf("Can't Open Serial Port!\n");
  52.                 return -1;
  53.         }

  54.         tcgetattr(fd,&oldtio);
  55.         setTermios(&newtio,B115200);         tcflush(fd, TCIFLUSH);
  56.         tcsetattr(fd,TCSANOW,&newtio);

  57.         tv.tv_sec=timeout_s;
  58.         tv.tv_usec=timeout_us;

  59.         nwrite=write(fd, send_buf, send_len);
  60.         if(nwrite<send_len)
  61.         {
  62.                 printf("Serial Write error!\n");
  63.                 return -1;
  64.         }
  65.         FD_ZERO(&rfds);
  66.         FD_SET(fd,&rfds);
  67.         if (select(1+fd,&rfds,NULL,NULL,&tv)>0)
  68.         {
  69.                 if(FD_ISSET(fd,&rfds))
  70.                 {       
  71.                         sleep(wait_s);
  72.                         usleep(wait_us);
  73.                         nread=read(fd, buff, BUFSIZE);
  74.                         if(nread<0)
  75.                         {       
  76.                                 printf("serial read error!\n");
  77.                                 return -1;
  78.                         }
  79.                         memcpy(recv_buf,buff,nread);
  80.                 }
  81.         }
  82. #ifdef DEBUG
  83.         buff[nread]='\0';
  84.         printf("RECEIVED::%s\n",buff);
  85. #endif
  86.         tcsetattr(fd,TCSANOW,&oldtio);
  87.         close(fd);
  88.         return nread;
  89. }


  90. int serial_send_recv(char *send_buf,int send_len,char *send_content,int content_len,char *recv_buf,int timeout_s,int timeout_us,int wait_s,int wait_us)
  91. {
  92.         int fd;
  93.         int nread=0;
  94.         int nwrite=0;
  95.         char buff[BUFSIZE];
  96.         struct termios oldtio,newtio;
  97.            struct timeval tv;
  98.         char *dev ="/dev/tts/0";
  99.         fd_set rfds;

  100.         if ( (fd = open(dev,O_RDWR | O_NOCTTY ))<0)
  101.         {
  102.                 printf("Can't Open Serial Port!\n");
  103.                 return -1;
  104.         }
  105.         tcgetattr(fd,&oldtio);
  106.         setTermios(&newtio,B115200);         tcflush(fd, TCIFLUSH);
  107.         tcsetattr(fd,TCSANOW,&newtio);

  108.         tv.tv_sec=timeout_s;
  109.         tv.tv_usec=timeout_us;
  110.         nwrite=write(fd, send_buf, send_len);
  111.         if(nwrite<send_len)
  112.         {
  113.                 printf("Serial Write error!\n");
  114.                 return -1;
  115.         }
  116.         FD_ZERO(&rfds);
  117.         FD_SET(fd,&rfds);
  118.         if (select(1+fd,&rfds,NULL,NULL,&tv)>0)
  119.         {
  120.                 if(FD_ISSET(fd,&rfds))
  121.                 {       
  122.                         sleep(1);
  123.                         usleep(wait_us);
  124.                         nread=read(fd, buff, BUFSIZE);
  125.                         if(nread<0)
  126.                         {       
  127.                                 printf("serial read error!\n");
  128.                                 return -1;
  129.                         }
  130.                         memcpy(recv_buf,buff,nread);
  131.                 }
  132.         }
  133. #ifdef DEBUG
  134.         buff[nread]='\0';
  135.         printf("RECEIVED::%s\n",buff);
  136. #endif
  137.         sleep(1);
  138.         tv.tv_sec=timeout_s;
  139.         tv.tv_usec=timeout_us;
  140.         nwrite=write(fd, send_content, content_len);
  141.         if(nwrite<content_len)
  142.         {
  143.                 printf("Serial Write error!\n");
  144.                 return -1;
  145.         }
  146.         FD_ZERO(&rfds);
  147.         FD_SET(fd,&rfds);
  148.         if (select(1+fd,&rfds,NULL,NULL,&tv)>0)
  149.         {
  150.                 if(FD_ISSET(fd,&rfds))
  151.                 {       
  152.                         sleep(wait_s);
  153.                         usleep(wait_us);
  154.                         nread=read(fd, buff, BUFSIZE);
  155.                         if(nread<0)
  156.                         {       
  157.                                 printf("serial read error!\n");
  158.                                 return -1;
  159.                         }
  160.                         memcpy(recv_buf,buff,nread);
  161.                 }
  162.         }
  163. #ifdef DEBUG
  164.         buff[nread]='\0';
  165.         printf("RECEIVED::%s\n",buff);
  166. #endif
  167.         tcsetattr(fd,TCSANOW,&oldtio);
  168.         close(fd);
  169.         return nread;
  170. }

复制代码


参考一下吧

论坛徽章:
0
6 [报告]
发表于 2009-12-09 10:32 |只看该作者

回复 #4 T-Bagwell 的帖子

谢谢T-Bagwell !我看看这个程序!

论坛徽章:
0
7 [报告]
发表于 2009-12-09 18:36 |只看该作者

回复 #6 hacktao 的帖子

网上有课串口库,这个库程序是C写的,拿过来直接用,接口都给你写好了的。。

论坛徽章:
0
8 [报告]
发表于 2009-12-09 18:40 |只看该作者

回复 #5 T-Bagwell 的帖子

斑竹是好人,我正需要这个GPRS的代码。之前自己写的GSM短信猫的程序,只实现了通过GSM短信猫发短信。对于接收部分还没实现。
收下了。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP