天嵌 ARM开发社区

 找回密码
 注册
查看: 2572|回复: 4

用扩展串口接收GSM短信数据遇到点问题

[复制链接]
zhanyun116 发表于 2013-4-21 19:28:44 | 显示全部楼层 |阅读模式
10
      用扩展的串口与TC35连接做了一个短信的收发模块。当按下按键时可以发送短信,当接收到短信时可以点灯或者打开蜂鸣器。按下按键发送短信可以实现,但是当接收到短信(短信接收方式已设为中断方式即收到短信时会从串口发出数据)时,2440的扩展串口貌似接收不到数据,以下是部分源码:int main(void)

{

        serial_init();
       
        /*打开键盘设备文件*/
        buttons_fd = open("/dev/IRQ-Test", 0);
        if (buttons_fd < 0)       
        {
                perror("open device buttons");
                exit(1);
        }

        for (;;)       
        {
                char key_value_temp[4];               
                int ret;
                /*开始读取键盘驱动发出的数据,注意key_value和键盘驱动中定义为一致的类型*/
                ret = read(buttons_fd, key_value_temp, sizeof(key_value_temp));
                if (ret != sizeof(key_value_temp))               
                {
                        perror("read buttons:");
                        exit(1);
                }               
                /*打印键值*/
                #if 1
                for (i = 0; i < sizeof(key_value); i ++)               
                {                       
                        if(key_value[i] != key_value_temp[i])
                        {                               
                                key_value[i] = key_value_temp[i];       
                                if(key_value[i] !='0')
                                {
                                        nwrite = write(serial_fd,TC_MDSJ,sizeof(TC_MDSJ));//"AT+CMGS=\r"
                                        printf("nwrite=%d\n",nwrite);
                                        printf("%s",TC_MDSJ);
                                        printf("\n");

                                        sleep(1);
                                        nread=read(serial_fd,TC_RE,50);
                                        if(nread>0)
                                        {
                                                printf("nread=%d\n",nread);
                                                printf("%s",TC_RE);
                                                printf("\n");
                                        }

                                        nwrite = write(serial_fd,TC_FSNR,sizeof(TC_FSNR));//"@set temperature"
                                        printf("nwrite=%d\n",nwrite);
                                        printf("%s",TC_FSNR);
                                        printf("\n");

                                        sleep(1);
                                        nread=read(serial_fd,TC_RE,50);
                                        if(nread>0)
                                        {
                                                printf("nread=%d\n",nread);
                                                printf("%s",TC_RE);
                                                printf("\n");
                                        }
                                        CurCmdInfo=ATDAT;
                                        nwrite = write(serial_fd,TC_EOF,sizeof(TC_EOF));//0x1A,"\r\n"
                                        printf("nwrite=%d\n",nwrite);
                                        printf("%s",TC_EOF);
                                        printf("\n");

                                        sleep(1);
                                        nread=read(serial_fd,TC_RE,50);
                                        if(nread>0)
                                        {
                                                printf("nread=%d\n",nread);
                                                printf("%s",TC_RE);
                                                printf("\n");
                                        }
                                }
                        }               
                }               
                #endif
////////////////以下就是收到短信之后采取的动作,但是压根就没进去过  不知道为什么
                nread=read(serial_fd,TC_RE,100);
                if(nread>0)
                {
                        for(i=0;i<(nread-1);i++)
                        {
                                if((TC_RE[i]=='C')&&(TC_RE[i+1]=='M'))
                                {
                                        cmtag=i;
                                        printf("nread=%d\n",nread);
                                        printf("%s",TC_RE);
                                        printf("\n");
                                        break;
                                }
                                else
                                {
                                        continue;
                                }
                        }


                        if((TC_RE[cmtag]=='C')&&(TC_RE[cmtag+1]=='M'))
                        {
                                nwrite = write(serial_fd,TC_DQML,sizeof(TC_DQML));//"AT+CMGR=1\r"
                               
                                printf("nwrite=%d\n",nwrite);
                                printf("%s",TC_EOF);
                                printf("\n");

                                sleep(1);
                                for(i=0;i<100;i++)
                               {
                                     TC_RE[i]=0;
                               }

                                        nread=read(serial_fd,TC_RE,100);
                                        for(i=0;i<(nread-1);i++)
                                        {
                                                if(((TC_RE[i]=='p')&&(TC_RE[i+1]=='w'))||((TC_RE[i]=='l')&&(TC_RE[i+1]=='e')))
                                                {
                                                        ptag=i;
                                                        break;
                                                }
                                                else
                                                {
                                                        continue;
                                                }
                                        }

                                optag = TC_RE[ptag];
                                ontag = TC_RE[ptag+4];
                                   led_tag = TC_RE[3];
                                on=((ontag == '1')?1:0);
                                if(optag == 'p')
                                {
                                        pwm_op(on, 80);
                                }
                               
                }

               
        }

        /*关闭设备文件句柄*/
        close(buttons_fd);
        return 0;
}



代码只复制了部分上来,调试过程中发现两个现象,第一个是如果注释掉ret = read(buttons_fd, key_value_temp, sizeof(key_value_temp));这句代码,短信来了串口就能读到数据。第二个就是短信来了串口没反应,但是一按下按键串口立即就能收到数据。驱动是TQ已经做好了的,这里主要是做的一些应用程序。望论坛前辈给点解决办法,谢谢。


TQ-lkp 发表于 2013-4-22 08:59:01 | 显示全部楼层
试下我们提供的串口应用程序:
http://www.armbbs.net/forum.php? ... hlight=%B4%AE%BF%DA
回复

使用道具 举报

亚瑟王 发表于 2013-4-22 10:24:51 | 显示全部楼层
亲,你说的扩展串口是板子自带的串口转成232电平?还是你用串口扩展芯片扩展的(比如2550芯片或别的)?
回复

使用道具 举报

 楼主| zhanyun116 发表于 2013-4-22 13:53:55 | 显示全部楼层
亚瑟王 发表于 2013-4-22 10:24
亲,你说的扩展串口是板子自带的串口转成232电平?还是你用串口扩展芯片扩展的(比如2550芯片或别的)?

你好  我是直接用板子自带的扩展串口(TTL)和TC35互联,如果单独做两个程序,一个接收短信,一个发送短信都没什么问题。我现在合成一个程序,发送短信也没什么问题,但是接收短信时一直读不出串口里面的数据,如果我按下按键触发中断,立马就能读到原来接收到的短信内容,是不是串口中断和按键中断有冲突,但是又感觉不像。本来我是想按下按键就去发送短信,程序自动判断是否有新短信过来,如果注释掉ret = read(buttons_fd, key_value_temp, sizeof(key_value_temp));  这句话,一来新的短信立即就能从串口里面读出数据,想不通到底是什么原因。
回复

使用道具 举报

亚瑟王 发表于 2013-4-22 17:36:43 | 显示全部楼层
zhanyun116 发表于 2013-4-22 13:53
你好  我是直接用板子自带的扩展串口(TTL)和TC35互联,如果单独做两个程序,一个接收短信,一个发送短信 ...

读串口是阻塞的,你可以理解为对应的线程有个中断,有数据来了那个线程就工作了。
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-5-19 15:10 , Processed in 1.078125 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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