关于串口接收数据函数不被触发问题

zhinengjiagong 2018-08-01 03:59:50
我编写一个串口程序,在一个电脑上利用虚拟串口收发数据,但是自己程序发送没问题,使用串口助手给自己程序发送数据,自己程序中串口接收数据函数不被触发。一些关键设置,我已经做了,求高手帮助

if(!m_ComPort.get_PortOpen()) // 如果串口是关闭的
{
m_ComPort.put_CommPort(PortConfig->m_port_no.GetCurSel()+1); // 首先是指定端口号,使用方法m_MSCOM.put_CommPort(m_port.GetCurSel()+1);

m_ComPort.put_InputLen(0); // 设置当前接收区数据长度为0,表示全部读取

m_ComPort.put_InBufferSize(1024); // 设置当前接收区数据长度为1024

m_ComPort.put_OutBufferSize(1024); // 设置当前发送区数据长度为1024

m_ComPort.put_RThreshold(1); // 缓冲区一个字符引发事件

m_ComPort.put_RTSEnable(1); // 设置RT允许

m_ComPort.put_InputMode(1); // 以二进制方式读写数据 用来设定数据接收模式,1表示二进制,0表示文本
.............................................................


void CMy40KW_UI_SoftWareDlg::OnMSCOM_FUNCTION()
{
// TODO: 在此添加命令处理程序代码
VARIANT m_input ;

unsigned int iCount=0;

CString strtemp;

BYTE data[1024]; // 定义存放二进制数据的数组

memset(data,0,sizeof(data)); // 清空读取数据缓冲区

unsigned int nEvent= m_ComPort.get_CommEvent(); // 获得事件编号

switch(nEvent)
{
case 1: AfxMessageBox(_T("进入数据处理0"));break;

case 2: //接收缓冲区有数据

iCount = m_ComPort.get_InBufferCount(); // 接收到的字符数

if(iCount>0) // 如果接收的字节数大于等于0
{

InputData=m_ComPort.get_Input(); // 读缓冲区

fs=InputData; // VARIANT型变量转换为COleSafeArray型变量

PosSize= fs.GetOneDimSize(); // 获取读取字节数

for(long k=0;k<PosSize;k++)
{
fs.GetElement(&k,data+k); // 转换为BYTE型数组
}

memcpy(TempData,data,sizeof(data)); // 内存拷贝

}
}
...全文
496 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhinengjiagong 2018-08-01
  • 打赏
  • 举报
回复
有这个函数

if(!m_ComPort.get_PortOpen()) // 如果串口是关闭的
{
m_ComPort.put_CommPort(PortConfig->m_port_no.GetCurSel()+1); // 首先是指定端口号,使用方法m_MSCOM.put_CommPort(m_port.GetCurSel()+1);

m_ComPort.put_InputLen(0); // 设置当前接收区数据长度为0,表示全部读取

m_ComPort.put_InBufferSize(1024); // 设置当前接收区数据长度为1024

m_ComPort.put_OutBufferSize(1024); // 设置当前发送区数据长度为1024

m_ComPort.put_RThreshold(1); // 缓冲区一个字符引发事件

m_ComPort.put_RTSEnable(1); // 设置RT允许

m_ComPort.put_InputMode(1); // 以二进制方式读写数据 用来设定数据接收模式,1表示二进制,0表示文本


if(false==m_ComPort.get_PortOpen()) // 如果串口是关闭的
{
m_ComPort.put_PortOpen(true); // 打开串口
}
if( m_ComPort.get_PortOpen()) // 获取串口的打开状态,判断是否真的打开串口,如果真的打开串口
{
m_ComPort.get_Input(); // 预读缓冲区以清除残留数据
//
tagPort_Open=1; // 将串口监控变量置位:表明串口打开。
//
PurgeComm(m_ComPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); // 清空缓冲区

// 将波特率,数据位,校验位,停止位转换为CString类型 Format是CString的成员函数 CString temp temp.Format();
strBaundBits.Format(_T("%d"), BaundRate);
strDataBits.Format(_T("%d"), DataBits);
strStopBits.Format(_T("%d"), StopBits);

strComPort = strBaundBits + ','+ CheckBits + ',' + strDataBits + ',' + strStopBits;

m_ComPort.put_Settings(strComPort); // 录入波特率,奇偶校验,数据位,停止位的信息
zgl7903 2018-08-01
  • 打赏
  • 举报
回复
缺少 SetSettings 设置端口参数
DECLARE_EVENTSINK_MAP BEGIN_EVENTSINK_MAP END_EVENTSINK_MAP 做事件映射
tiger波波 2018-08-01
  • 打赏
  • 举报
回复
https://www.cnblogs.com/rechen/p/5087530.html

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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