wince串口编程编译的问题,刚接触这方面,请大神帮忙解答,特别着急,谢谢

xuebatiantang 2016-10-23 09:22:09
我用的编译器是VS2008,wince串口程序编译之后通过串口调试助手,数据的接收和发送都是正常的,但是在最后关闭主窗口是会弹出错误消息。自己刚刚开始接触wince,之前写过的串口程序都没有成功,只有这个仿照别人的程序成功了,但是就是最后关闭的时候会出现问题,请各位帮忙给说一下,挺着急的,麻烦各位了。


源码如下
//接收串口数据线程
UINT ReadThread(LPVOID pParam)
{
Ctest1Dlg *Pthis = (Ctest1Dlg*)pParam ; //转换参数为CUartDlg类型,以便于等下可以使用它的成员变量和函数等。
if(Pthis == NULL) //检查参数是否有效
return 0;
BYTE byData;
DWORD dwBytes;
BYTE byReceiveBuf[1024]; ///缓冲区的大小
int nBytes= 0;
DWORD evtMask;
//设置字符监听信号
SetCommMask (Pthis->m_hcom, EV_RXCHAR | EV_CTS | EV_DSR );
//只要m_hcom有效,就一直循环
while (Pthis->m_hcom != NULL && Pthis->m_hcom != INVALID_HANDLE_VALUE)
{
//等待收到串口信号
if (WaitCommEvent(Pthis->m_hcom, &evtMask, 0))
{
//设置字符监听信号
SetCommMask (Pthis->m_hcom, EV_RXCHAR | EV_CTS | EV_DSR );
//清空接收数组
memset(byReceiveBuf, 0, 1024);
nBytes = 0;
do
{
//读字符
if(ReadFile(Pthis->m_hcom, &byData, 1, &dwBytes, 0))
{
if(dwBytes == 1)
{
byReceiveBuf[nBytes++] = byData;
if(nBytes == 1024)
{
break; //接收缓冲区已满
}
}
}
} while (dwBytes == 1);
byReceiveBuf[nBytes] = '\0';
if(nBytes == 0) //没接到数据
{
continue; //继续循环
}
//开始对收到的字符串进行处理
CString str;
//读取接收文本框中原来的字符
((CEdit*)Pthis->GetDlgItem(IDC_EDIT_RECEIVE))->GetWindowTextW(str);
CString str_new;
//把新收到的字符转换称CString类型
str_new = byReceiveBuf;
//连接原来的字符和新的字符
str += str_new;
//设置接收文本框的字符
((CEdit*)Pthis->GetDlgItem(IDC_EDIT_RECEIVE))->SetWindowTextW(str);
}
}
return 0;
}
BOOL Ctest1Dlg::WritePort(const char *str)
{
DWORD dwNumBytesWritten;
DWORD dwHaveNumWritten =0 ; //已经写入多少
DWORD bufLen = strlen(str);
//判断串口是否有效
if(m_hcom == NULL || m_hcom == INVALID_HANDLE_VALUE)
{
return FALSE;
}
do
{
if (WriteFile (m_hcom, //串口句柄
str+dwHaveNumWritten, //被写数据缓冲区
bufLen - dwHaveNumWritten, //被写数据缓冲区大小
&dwNumBytesWritten, //函数执行成功后,返回实际向串口写的个数
NULL)) //此处必须设置NULL
{
dwHaveNumWritten = dwHaveNumWritten + dwNumBytesWritten;
//写入完成
if (dwHaveNumWritten == bufLen)
{
break;
}
Sleep(10);
}
else
{
return FALSE;
}
}while (TRUE);
return TRUE;
}
void Ctest1Dlg::OnBnClickedButtonOpen()
{
// TODO: Add your control notification handler code here
//打开串口
m_hcom = CreateFile(_T("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
//检测是否打开串口成功
if(m_hcom != INVALID_HANDLE_VALUE && m_hcom != NULL)
{
DCB dcb;
dcb.DCBlength = sizeof(DCB);
//配置串口参数
GetCommState(m_hcom, &dcb);
dcb.BaudRate = CBR_115200 ; //波特率
dcb.ByteSize = 8; //数据位
dcb.Parity = NOPARITY; //奇偶校验
dcb.StopBits = ONESTOPBIT; //停止位

if (!SetCommState(m_hcom, &dcb))
{
//配置串口失败
MessageBox(_T("Set COM port fail!"));
return ;
}
//配置超时值
COMMTIMEOUTS cto;
GetCommTimeouts(m_hcom, &cto);
cto.ReadIntervalTimeout = MAXDWORD;
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.WriteTotalTimeoutMultiplier = 10;
cto.WriteTotalTimeoutConstant = 1000;
if (!SetCommTimeouts(m_hcom, &cto))
{
//不能设置超时参数
MessageBox(_T("Set COM timeout fail!"));
return ;
}
}
else
{
MessageBox(_T("Open COM fail!"));
return ;
}
//串口打开有效,启动读串口线程
DWORD m_dwThreadID;
HANDLE m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadThread, this, 0, &m_dwThreadID);
CloseHandle(m_hThread);
}
void CUartDlg::OnBnClickedButtonClose()
{
// TODO: Add your control notification handler code here
if(m_hcom)
{
CloseHandle(m_hcom);
m_hcom = NULL;
}
}
void Ctest1Dlg::OnBnClickedButtonClear()
{
// TODO: Add your control notification handler code here
((CEdit*)GetDlgItem(IDC_EDIT_RECEIVE))->SetWindowTextW(_T(""));
}
void CUartDlg::OnBnClickedButtonSend()
{
// TODO: Add your control notification handler code here
CString str_send;
//获取文本框中的字符
((CEdit*)GetDlgItem(IDC_EDIT_SEND))->GetWindowTextW(str_send);
//判断字符串是否为空
if(str_send.IsEmpty())
{
return; //字符串为空,返回
}
char send[1024];
//把宽字符转换为字符型
wcstombs(send, str_send, 1024);
//发送信息
if(!WritePort(send))
{
MessageBox(_T("Write Port fail"));
}
}

...全文
189 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuebatiantang 2016-10-24
  • 打赏
  • 举报
回复
引用 2 楼 91program 的回复:
首先,看看程序退出时有没有做什么处理。 其次,这类程序可能与程序运行过程中出现的小范围内存操作越界有关。只是当时未表现出来,等到程序退出时才出现提示。这种现象之前遇到过,但不确定是不是 LZ 遇到的现象的原因。 最后,如果实在找不到原因,只能现注释部分代码来分块排除。
谢谢您的帮助,再麻烦您两个问题:1.之前定义的HANDLE m_hcom句柄放在test1Dlg.h中的public下一只出错,但是将放在test1Dlg.cpp定义为全局变量之后删除Pthis->m_hcomz中的Pthis->之后就不会有问题,能不能帮忙给解答一下这是怎么回事。2.我想问一下WritePort和数据发送之间的调用机制是怎样的,一直想不明白。谢谢,麻烦了
91program 2016-10-24
  • 打赏
  • 举报
回复
首先,看看程序退出时有没有做什么处理。 其次,这类程序可能与程序运行过程中出现的小范围内存操作越界有关。只是当时未表现出来,等到程序退出时才出现提示。这种现象之前遇到过,但不确定是不是 LZ 遇到的现象的原因。 最后,如果实在找不到原因,只能现注释部分代码来分块排除。
xuebatiantang 2016-10-23
  • 打赏
  • 举报
回复
帮个忙吧各位,谢谢了

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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