通过串口实现AT指令的发送

liuharris 2010-04-02 02:38:48
我想做一个串口调试工具,通过向GSM MODEM发送AT指令,实现短信的收发
我用的是WAVECOM的短信猫,请高手们帮我看一下串口发送函数设置有没有错误,因为我发送AT指令后收到的是一些乱码
不知道是发送格式错了还是接收有问题
例如我在编辑框输入 AT 后点击发送,返回乱码 A狹
输入AT+IPR=9600 发送,返回 A猭櫎?y柸d慀
发送的指令如果用小写(例如发送at at+ipr=9600)返回的数据也不一样,请指教
是不是writefile()和readfile()函数参数错了,分不够可以加

void CMSGCOMDlg::OnSetport() //设置串口参数
{
SetupComm(hCom, 1024, 1024); //设置发送和接收缓冲区大小
//设置串口信息
DCB dcb;
GetCommState(hCom, &dcb);
dcb.BaudRate = 9600;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.ByteSize = 8;
dcb.Parity = ODDPARITY;
dcb.StopBits = ONESTOPBIT;
if(!SetCommState(hCom,&dcb))
{
MessageBox("设置失败", "提示");
return;
}
if(!SetCommMask(hCom, EV_RXCHAR | EV_TXEMPTY))
{
MessageBox("掩码设置失败", "提示");
return;
}
DWORD param;
hThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, //安全属性
0, //初始化线程栈的大小,缺省为与主线程大小相同
(LPTHREAD_START_ROUTINE)ThreadFunction, //线程的全局函数
¶m, //此处传入了主框架的句柄
0, //创建后立即激活
&dwThreadID); //保存新线程的id
if (hThread == INVALID_HANDLE_VALUE)
{
MessageBox("线程创建失败", "提示");
return;
}
IsFun = TRUE;
}

void CMSGCOMDlg::OnSend() // 发送AT指令
{
DWORD res;
DWORD factdata = 0;
CString str;
m_data.GetWindowText(str); //str接收编辑框输入的AT指令
str += "\r\n";
wOverLaped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //创建一个事件对象
IsStop = FALSE;
if (WriteFile(hCom, str, str.GetLength(), &factdata, &wOverLaped)) //开始发送数据
{
IsStop = TRUE;
MessageBox("发送成功");
}
else if(GetLastError()==ERROR_IO_PENDING)
{

res = WaitForSingleObject(wOverLaped.hEvent, 2000); //延时2秒,等待数据发送
if (WAIT_OBJECT_0 == res) //如果事件处于有信号状态,表示发送完成
{
IsStop = TRUE;
}
else
IsStop = FALSE;

Sleep(1000); //延时1秒钟
}
}

DWORD ThreadFunction(LPVOID pParam)//线程函数
{
DWORD dwEvtMask ,dwResult;
tOverLaped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);//创建一个事件
while(IsFun)
{
//等待窗口事件
WaitCommEvent(((CMSGCOMDlg*)AfxGetMainWnd())->hCom,
&dwEvtMask, &tOverLaped);
//如果事件没有信号,延时0.1秒
dwResult = WaitForSingleObject(tOverLaped.hEvent, 100);

if(dwResult == WAIT_OBJECT_0) //事件对象有信号
{
if(dwEvtMask == EV_RXCHAR) //接收到数据
{
if(IsStop)//发送停止
{
IsStop = FALSE;
//发送消息,由消息处理函数接收数据
::PostMessage(AfxGetMainWnd()->m_hWnd, CM_RECEIVE,
0,(LPARAM)EV_RXCHAR);
}
}
}
}
return 0;
}


void CMSGCOMDlg::OnRecieveData(WPARAM wParam, LPARAM lParam)//自定义消息处理函数,用于接收消息
{
DWORD res, factbyte;

memset(DataBuffer, 0, 1024); //初始化数据缓冲区
COMSTAT rst;

ClearCommError(hCom, &res, &rst); //清空串口错误标志,记录当前通信状态

rOverLaped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //创建一个事件对象

if (ReadFile(hCom, DataBuffer, rst.cbInQue, &factbyte, &rOverLaped)) //读取数据到缓冲区中
{
DataBuffer[rst.cbInQue] = 0;
IsStop = FALSE;
}
else
{
res = WaitForSingleObject(rOverLaped.hEvent, 2000);
}
IsStop = FALSE;
CString str = DataBuffer;

m_outwnd += str + "\r\n"; //将收到的数据显示到编辑框控件上
UpdateData(FALSE);
}
...全文
2846 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称测试 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 9 楼 huliang66 的回复:

留邮箱,给你一个AT指令发短信的DEMO。

麻烦也给我发一个,邮箱是tramp406@163.com,谢谢!
[/Quote]

麻烦看一下你的163邮箱,先谢了!
newasoft 2010-04-10
  • 打赏
  • 举报
回复
liuharris 2010-04-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 huliang66 的回复:]
邮件已发,有详细的AT指令集和短信DEMO程序。里面有串口操作类。
[/Quote]

邮件已收到,十分感激
huliang66 2010-04-10
  • 打赏
  • 举报
回复
邮件已发,有详细的AT指令集和短信DEMO程序。里面有串口操作类。
atuwang 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huliang66 的回复:]

留邮箱,给你一个AT指令发短信的DEMO。
[/Quote]
麻烦也给我发一个,邮箱是tramp406@163.com,谢谢!
liuharris 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wilson_hz 的回复:]
引用 8 楼 liuharris 的回复:
引用 6 楼 wilson_hz 的回复:
呵呵,短信猫,这个东东我熟悉的很,经常开发这个东西。
发送AT 返回的应该是OK才对,你那个乱码是因为你没有转码造成的,自己查查看。没解决再来发问,随时恭候!!


你好,我用串口调试工具测试是没有问题的,发送AT指令均成功,可以拨电话,可以发短信。
请问我用writefile()函数发AT指令还……
[/Quote]


你好,关于转码这点我不是很明白。可以添点代码让我做一下参考吗,关于这个我问题已经困扰了好几天了,谢谢
liuharris 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huliang66 的回复:]
留邮箱,给你一个AT指令发短信的DEMO。
[/Quote]

好的,谢谢,我的邮箱是huagongcs@126.com
wilson_hz 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liuharris 的回复:]
引用 6 楼 wilson_hz 的回复:
呵呵,短信猫,这个东东我熟悉的很,经常开发这个东西。
发送AT 返回的应该是OK才对,你那个乱码是因为你没有转码造成的,自己查查看。没解决再来发问,随时恭候!!


你好,我用串口调试工具测试是没有问题的,发送AT指令均成功,可以拨电话,可以发短信。
请问我用writefile()函数发AT指令还需要先转码吗?
[/Quote]
建议你多网上看看相关的内容吧!其实你的问题只是一个很小很小的问题了,呵呵。我觉得你能搞定。

晚上我过来看你帖子,还没好的话,我给你贴点代码。
huliang66 2010-04-09
  • 打赏
  • 举报
回复
留邮箱,给你一个AT指令发短信的DEMO。
liuharris 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wilson_hz 的回复:]
呵呵,短信猫,这个东东我熟悉的很,经常开发这个东西。
发送AT 返回的应该是OK才对,你那个乱码是因为你没有转码造成的,自己查查看。没解决再来发问,随时恭候!!
[/Quote]

你好,我用串口调试工具测试是没有问题的,发送AT指令均成功,可以拨电话,可以发短信。
请问我用writefile()函数发AT指令还需要先转码吗?
这不是鸭头 2010-04-09
  • 打赏
  • 举报
回复
是不是字符集的问题呢?
wilson_hz 2010-04-09
  • 打赏
  • 举报
回复
呵呵,短信猫,这个东东我熟悉的很,经常开发这个东西。
发送AT 返回的应该是OK才对,你那个乱码是因为你没有转码造成的,自己查查看。没解决再来发问,随时恭候!!
向立天 2010-04-09
  • 打赏
  • 举报
回复
我手里有一个串口助手的源码
也是网上下的
如果需要可以给你试试
看有没有问题
liuharris 2010-04-02
  • 打赏
  • 举报
回复
完成正常
zgl7903 2010-04-02
  • 打赏
  • 举报
回复
用串口精灵等工具先试下是否正常
liuharris 2010-04-02
  • 打赏
  • 举报
回复
自己顶一个,没人回答啊
liuharris 2010-04-02
  • 打赏
  • 举报
回复
还有变量的定义忘了(接上帖)
.h
public:
HANDLE hCom; //串口句柄
HANDLE hThread; //线程句柄
DWORD dwThreadID; //线程ID
char DataBuffer[1024]; //接收数据的缓冲区
CString strPath;
CString strText;

.cpp
//自定义一个消息
const CM_RECEIVE = WM_USER+100;
OVERLAPPED tOverLaped= {0}; //线程函数使用的OVERLAPPED结构
OVERLAPPED wOverLaped = {0}; //写操作使用的OVERLAPPED结构
OVERLAPPED rOverLaped = {0}; //读操作使用的OVERLAPPED结构
BOOL IsFun = TRUE; //线程是否运行
BOOL IsStop = FALSE; //数据是否发送完毕

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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