关于串口读写数据问题
请教大家一个串口读写数据的问题,自己写的一个串口类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的成员函数,只要不涉及到读串口和写串口等串口相关操作的,调用后的结果都是
正确的,请教!}
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的成员函数,只要不涉及到读串口和写串口等串口相关操作的,调用后的结果都是
正确的,请教!}
...全文
相关推荐
用多线程实现串口读写数据以及文件的读写
为了在多线程环境下安全地读写文件,我们需要考虑线程同步问题。可以通过使用CSingleLock或CCriticalSection等同步对象来确保在任何时候只有一个线程能访问文件,防止数据冲突。
C#串口数据读写
C#串口数据读写C#中的串口数据读写是指通过串口来读取和写入数据的过程。在这个过程中,需要使用SerialPort类来操作串口。
Java串口操作_java串口编程_
读写数据:使用`writeBytes()`或`readBytes()`等方法进行串口读写操作。7. 关闭串口:完成通信后,记得调用`closePort()`关闭串口。四、常见问题及解决方法1.
c++串口读写实例源代码
**串口读写**:串口读写是串口通信的核心部分,涉及打开串口、设置波特率、数据位、校验位、停止位等参数,以及接收和发送数据的函数调用。
串口读写_串口读写labview_
在实际应用中,我们可能还需要处理一些高级问题,如流控制(CTS/RTS)、握手协议(XON/XOFF)等。


