关于串口读写数据问题

liuharris liuharris 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请教大家一个串口读写数据的问题,自己写的一个串口类CSerialPort,封装有OpenCom(),CloseCom();
WriteCom();ReadCom()...等等方法,一个用在短信发送的GsmComm类,包括GsmInit(),GsmSendMsg()....等等方法,GsmInit()中调用了类CSerialPort的方法WriteCom()对MODEM进行初始化;通过ReadCom()读取返回数据判断初始化是否成功.

现在我在一个窗口类CMyDlg中开一个线程监控串口,有返回数据的时候调用ReadCom()读取数据并输出到列表框。我在这个窗口类中直接调用CSerialPort的WriteCom(),数据接收没有问题。但我在窗口类调用GsmInit()的时候,线程就监控不到串口有数据返回。不知道问题出在哪里,请高手指教。

在CMyDlg.cpp中通过以下方式调用CSerialPort的成员函数是对的,如
--CMyDlg.cpp--
CSerialPort SP; //全局对象
BOOL CMyDlg::OnInitDialog()
{
......
if(!SP.OpenCom("COM1", 9600, NOPARITY, 8, ONESTOPBIT))
MessageBox("串口打开失败");
......
}

void CMyDlg::OnSend()
{
.......
SP.WriteCom("AT\r\n"); //发送AT指令
.......
线程监控到串口有接收数据,调用SP.ReadCom()读数据等等,打开串口成功,返回数据也是正确的
}

在类GsmComm中成员函数也用到了CSerialPort的方法
--GsmComm.cpp--
CSerialPort SPort; //全局对象
BOOL GsmComm::GsmInit()
{
CString strAns;
// 测试设备是否存在
SPort.WriteCom("AT\r\n");
Sleep(100);
SPort.ReadCom(strAns);
if (strAns.Find("OK")<0)
return FALSE; //找不到GSM MODEM

// 关闭回显
SPort.WriteCom("ATE0\r\n");

// PDU短信模式
SPort.WriteCom("AT+CMGF=0\r\n");
Sleep(100);
SPort.ReadCom(strAns);
if(strAns.Find("OK")<0) return FALSE;

return TRUE;
}


如果我在CMyDlg.cpp中如下方法调用的话,串口打开成功,但写数据失败,没有数据返回
CMyDlg.cpp

void CMyMDlg::OnSend() //发送按钮
{
......
GsmComm gsmc;// 此定义为全局对象结果也是一样的,应该不是问题所在
gsmc.GsmInit();//初始化MODEM(此处涉及了写数据和读数据的函数)
.....
这样初始化不成功,请问那里错了,那个地方出问题了。
另外,在CMyDlg中调用GsmComm的成员函数,只要不涉及到读串口和写串口等串口相关操作的,调用后的结果都是
正确的,请教!
}

...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
liuharris
VC/MFC 16,550 成员 421,606 内容