急急急:请教各位大虾关于串口通信的问题!!!!!

csc_xixi 2010-08-02 05:19:23
这个程序的主要目的是向串口发送AT命令(基于嵌入式Linux),是短信猫发短信,但问题是不能发出短信,已经排除是硬件问题,希望大家帮帮忙,这个程序错在什么地方。
void serial_rw()
{
int i;
char buff[512];
char buff_t[]="AT\n";
char receive[3]="w";
char buff4[] = "AT+CMGD=1\n";
char buff2[] = "AT+CMGS=15045268420\n";
char buff3[] = "this is a test message";
int nread,nwrite;
printf("the num is:%s\n",buff2);
write( serial_fd,buff_t,sizeof(buff_t) );
sleep(5);
read( serial_fd,receive,sizeof(receive) );
printf( "receive: %s\n",receive );
nwrite = write(serial_fd,buff4,sizeof(buff4));
sleep(5);
nwrite = write(serial_fd,buff2,sizeof(buff2));
sleep(5);
printf("nwrite=%d\n",nwrite);
nwrite = write(serial_fd,buff3,sizeof(buff3));
sleep(5);
printf("send nwrite=%d\n",nwrite);
nwrite = write(serial_fd,"\x1a",sizeof("\x1a"));
sleep(5);
printf("end of send message\r\n");
while(1)
{
}
close(serial_fd);
}
...全文
430 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
suixin307 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 garefield 的回复:]
如果用的是虚拟机,可以给虚拟机建两个命名管道的串口,两个命名管道指向同一个文件,注意设置是一个主一个从,然后一个串口写,另一个读,这样可以绕开串口的设置检测代码的问题,如果这样能读写数据而实际串口没数据,那就要检测是不是程序中的串口设置问题。
[/Quote]

这个是怎么个意思??能不能写的详细点
wuersui 2011-01-16
  • 打赏
  • 举报
回复
将char buff_t[]="AT\n";这句中的"AT\n"改成"AT\r"试试
谭海燕 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ecsape 的回复:]
关于串口问题的帖子还真不少啊,建议班主总结下,发个置顶贴吧。
[/Quote]

恩。可以考虑。
ecsape 2010-08-03
  • 打赏
  • 举报
回复
关于串口问题的帖子还真不少啊,建议班主总结下,发个置顶贴吧。
谭海燕 2010-08-03
  • 打赏
  • 举报
回复
read得到AT,说明数据没有发送出去,你读出来的东西就是你发送的东西。

是串口设置出问题了。
csc_xixi 2010-08-03
  • 打赏
  • 举报
回复
回复2楼:
我想问一下,如果我想串口发送个AT命令,延时五秒后,用read函数,结果得到的是AT,而不是OK,请问这是怎么回事了
csc_xixi 2010-08-03
  • 打赏
  • 举报
回复
回复1楼:
前面有打开的函数,只是没写而已:
wwwunix 2010-08-03
  • 打赏
  • 举报
回复
支持一下2楼的。
garefield 2010-08-03
  • 打赏
  • 举报
回复
如果用的是虚拟机,可以给虚拟机建两个命名管道的串口,两个命名管道指向同一个文件,注意设置是一个主一个从,然后一个串口写,另一个读,这样可以绕开串口的设置检测代码的问题,如果这样能读写数据而实际串口没数据,那就要检测是不是程序中的串口设置问题。
csc_xixi 2010-08-03
  • 打赏
  • 举报
回复
不好意思,今天实在被这个问题整的头疼,明明知道该这么做,可是这么做就是不对,我都快疯了,查了很多的资料也没什么好办法
谭海燕 2010-08-03
  • 打赏
  • 举报
回复
你自己看下,你在这个帖子是怎么回复我的:

http://topic.csdn.net/u/20100803/10/c79dbf91-caf5-4edd-9fce-562be7f64b66.html?9058#replyachor


[Quote=引用 4 楼 csc_xixi 的回复:]
回复二楼:
我要是能那样做还用你说呀!
[/Quote]

我很想跟你说,你这种态度,今后发帖估计也没什么人敢回复你。

先别说谈技术,很简单的做人道理。
csc_xixi 2010-08-03
  • 打赏
  • 举报
回复
回复7楼:
谢谢,我还有个问题,用write函数向串口发AT命令,成功的返回了发送的字节数,但是延时五秒后用read函数读这个串口的时候返回的是-1(两个函数是对一个串口进行操作),请问这是怎么回事????????????能给个成功的例子吗?
谭海燕 2010-08-02
  • 打赏
  • 举报
回复
上面的总结,虽然说是针对短信猫的,也有大部分是针对串口通信的。
谭海燕 2010-08-02
  • 打赏
  • 举报
回复
前面已经回复过很多关于短信猫的问题,LZ可以搜索下。
我在这里就短信猫做一下终结:
1.拿到短信猫,和串口线,先在windows下,用windows的超级终端(波特率115200或者是9600.短信猫标准

波特率是9600),给猫发送AT指令。一来是检查串口线,而来检查猫



2.放到linux下之后,自己用程序给猫AT指令,很重要的一点就是设置串口。很多人拿到短信猫,然后google

个code然后跑起来,或则是自己写,发现无论怎样,都发送,或者接受不到,或者接受到的是乱码。那么,关

于这一点,引发以上问题的无非是:一,串口设置不对,参数,对于串口如何设置,我在这里就不说了,动动

手google下。二,极为重要的一点就是关于串口的flush。这一点很重要。关于如何flush,也是google。

三,请大家一定要记得memset。对于需要buff的,请大家一定要记得使用memset。否则,给短信猫发送的AT

指令,猫根本不认识,同样,猫发送来的数据就是乱码了。




3。防止你的开发板的TXD RXD没有交叉。我曾经月到过,PC机上绝对没问题,移到板子上,就接受发送不正常

了。最后发现是板子串口没有交叉。

在这里,给大家介绍一个种检测串口的办法:拿一根线,将你的串口的RXD和TXD链接起来。然后在超级终端

下按键盘,如果键盘可以正常显示,则说明串口是好的。至于哪个是RXD TXD,google吧。至于原理,你懂了

RXD 和TXD你就知道原理了。




4.程序中注意 \n \r之内的转义字符,这些字符很重要,那么你的程序多参考网上的,人家怎么写。





5。发送一条指令之后,请不要立马就去read,这样觉得是接受发送失败的。解决办法是:write之后,sleep

(nsec)。然后才是read。那么,对于read的时候,使用结合select使用才是最科学的。




6.短信猫,买回来,是不需要你对他进行设置的。只需要你把手机卡放到短信猫里面。就可以了。也不需要对

猫进行启动。现在的短信猫几乎都是上电就启动了。还有,没事不要去搬动短信猫天线,稍不注意,短信猫就

烧了。到现在我也不知道是为啥。



我对短信猫的总结,基本就到这里了。希望给大家一个参考。
Linux-Torvalds 2010-08-02
  • 打赏
  • 举报
回复
怎么没有打开操作的?

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧