串口调试GPRS模块

这周大部分时间主要用来调试GTM900B这个模块了,其实说白了,就是对于串口的操作,再换句话说就是对于文件的读写。

首先串口配置的问题

这次采用了标准模式(行缓冲),就是在发送命令后加上一个‘回车’才从串口中发出去,其实在发送‘回车’之前,我们的数据是存放在串口缓冲区中的,只有在遇到回车时,才将缓冲区中的数据发出。

这里就牵扯到一个回车(carriagereturn ’\r’,0X0D)跟换行(linefeed ‘\n’ 0X0A)的区别问题。

在很久很久以前,那时候计算机还木有出现,有一种叫电传打字机(teletypemodel 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒的时间,正好可以打两个字符。要是在这 0.2秒内有字符传过来,就会丢失。

   于是,研究人员想了一个办法,解决这个问题。就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

   后来计算机出现了,这时候存储器还是比较贵的,人们就认为在每一行后面加上两个字符(0X0A 0X0D)是比较浪费的,所以就产生了分歧,所以导致现在的不同系统中行尾的字符不同:Unix系统里,每行结尾只有“<换行>”,即“\n”;windows系统里,每行结尾是“<换行><回车>”,即“\n\r”;mac系统里,每行结尾是“<回车>”。一个直接后果是,unix/mac系统下的文件在windows里打开的话,所有文字会变成一行;而windows里的文件在unix/mac下打开的话,在每行的结尾可能会多出一个 ^M(ctrl+m回车) 符号。

对于串口中配置来说,我们可以将‘回车’,‘换行’配置成一个字符就是‘换行’,其实就是对于两个字符间的映射,而我们需要的是一个‘换行’来结束我们命令的发送,所以这个行缓冲问题到也不会影响我们程序,只要在发送AT指令时加上一个’\r’就可以了,例如

sprintf(write_buf,"ATE0\r");

write(Gprs_fd,write_buf,strlen(write_buf));

 

第二个问题是发送空短信的问题

这个问题就比较纠结了:一开始我使用文本方式发送短信,出现的问题是短信可以发出来,接收到的全是空短信,但是通过minicom发出来的短信就不是空短信。我以为是串口配置的问题:然后在运行minicom时,使用

stty –a </dev/ttyS0命令查看串口信息,关掉minicom后运行我的程序,再使用

stty –a </dev/ttyS0命令修改掉不同部分后,还是发送空短信,这就很郁闷了,周二一下午加一晚上都没能发出正常短信来(此处浪费短信无数。。)。周三上午来了,将modem and dialing中A B K项清空(事实证明不是这的问题),发现竟然能发出带内容的短信了,然后找原因,发现想让他发空短信都不行了,所以空短信的问题算是不了了之了。调试短信功能期间发送短信113条。

 

第三个问题是串口同时读写的问题

这个问题的提出是:gprs模块必须一直工作在接收状态,等待上位机发送来的配置信息,而我创建了一条TCP链接后,能不能一个线程一直阻塞在 read串口这里,而另外的线程可以调用GPRS_SEND函数发送信息呢?

在之前我一直以为串口在读的时候是不能进行写的,同时对一个文件进行读写操作会出错,这个问题是因为我在写socket通信的时候,对于同一个socket都是进行分时读写,所以一直认为读写是不能同时进行的。

经过跟勇哥的探讨发现这个其实不是这个样子的,我们在应用程序中调用write 或者 read 对设备文件进行操作时,其实调用的都是映射到内核模块中的ioctl中的操作函数。那么如果我们用户程序某个线程中read阻塞了,只能是这个线程阻塞了,而不是我们的驱动程序阻塞了,驱动其实就是一系列的操作函数集,他是不可能阻塞的,所以此时我们依旧可以使用另外的线程调用read和write来对设备进行读写,哪怕我开很多线程阻塞在read那也是无所谓的,只要资源够用就可以了(这个我已经测试过了。。。一不小心把创建线程放在了while(1)里,创建出那么多线程来,读写照样是正常的。。)。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计STC单片机GPRS模块的过程: 1. 确定使用的GPRS模块型号和通信接口:根据需求选择合适的GPRS模块,然后确定单片机与GPRS模块的通信接口方式,如串口通信或SPI通信等。 2. 确定单片机的引脚分配:根据GPRS模块的通信接口方式,确定单片机与GPRS模块之间的引脚连接方式,并根据连接方式进行引脚分配。 3. 编写单片机程序:根据GPRS模块的通信接口协议,编写单片机程序,实现单片机与GPRS模块的通信。 4. 进行硬件连接:根据引脚分配连接单片机和GPRS模块,然后进行电路连线。 5. 调试测试:完成硬件连接后,通过单片机调试工具和GPRS模块调试工具进行测试和调试,确保单片机和GPRS模块之间的通信正常。 6. 仿真分析:使用仿真软件进行电路仿真分析,检查电路的稳定性和可靠性。 7. 故障排除:如果在测试和仿真分析过程中发现故障,需要进行排除,找出故障原因并进行修复。 以上是设计STC单片机GPRS模块的大体过程,具体的实现方法需要根据具体的项目需求和硬件条件而定。 针对故障排除,需要注意以下几点: 1. 确认故障现象:先确认故障现象,了解具体的故障表现。 2. 检查硬件连接:检查单片机和GPRS模块之间的硬件连接是否正确,如引脚连接是否正确,电源是否正常等。 3. 检查程序代码:检查单片机程序代码是否有误,是否符合GPRS模块的通信协议。 4. 使用调试工具:使用单片机调试工具和GPRS模块调试工具进行测试和调试,定位故障原因。 5. 修改和修复:根据定位的故障原因,修改程序代码或进行硬件修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值