程序中为什么收不到串口发来的数据,而串口调试助手却可以?

mosquit 2005-08-31 05:27:29
从串口发命令,仪器会返回数据,程序接收不到数据,关掉程序,打开串口调试助手后,前面应该收到的数据全部由串口调试助手接收到,这是怎么回事?
用的是MSComm控件,设置如下:
m_ctrlComm2.SetCommPort(2); //选择com2
if( !m_ctrlComm2.GetPortOpen())
m_ctrlComm2.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("Can't open serial port");
m_ctrlComm2.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_ctrlComm2.SetInputMode(1); //1:以二进制方式检取数据
m_ctrlComm2.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm2.SetInputLen(0); //设置当前接收区数据长度为0,设置 InputLen 为 0 时,
//使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
m_ctrlComm2.GetInput();//先预读缓冲区以清除残留数据
...全文
2233 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mosquit 2005-09-06
  • 打赏
  • 举报
回复
问题解决,OnComm接收事件根本就没有触发,初始化时将这一句加进去就可以了:
m_ctrlComm2.SetRTSEnable(TRUE); // Must be set RTS is true.
mosquit 2005-09-01
  • 打赏
  • 举报
回复
用mscomm时常用的配置有哪些?
mosquit 2005-09-01
  • 打赏
  • 举报
回复
to: eeixy2000(eeixy2000)
去掉了你说的那两行代码,问题依旧
eeixy2000 2005-09-01
  • 打赏
  • 举报
回复
将下面这两行代码去掉看看(你在设置串口时的代码)
m_ctrlComm2.SetInputLen(0); // 设置当前接收区数据长度为0,设置 InputLen 为 0 时,使用
// Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
m_ctrlComm2.GetInput(); //先预读缓冲区以清除残留数据
mosquit 2005-09-01
  • 打赏
  • 举报
回复
OnComm事件处理过程如下:
void CMyCommAppDlg::OnComm2()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];
CString strtemp;
double dRtnPower;
if (m_ctrlComm2.GetCommEvent() == 2)
{
variant_inp = m_ctrlComm2.GetInput();
safearray_inp = variant_inp;
len=safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++)
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
strComm2RxData += strtemp; //加入接收缓冲区字符串
}
bPowerReached = TRUE;
//一旦接收到数据就弹出对话框显示:
#ifdef _MY_DEBUG_
AfxMessageBox(strComm2RxData);
#endif
}

//测试事件类型:
#ifdef _MY_DEBUG_
int tmp = m_ctrlComm2.GetCommEvent();
char a[2];
a[0] = tmp + 0x30;
a[1] = '\0';
CString str("CommEvent: ");
str += a;
AfxMessageBox(str);
#endif
}
结果测试事件的弹出对话框显示的是事件3和5,始终没有接收到数据,然而当我把程序关掉,打开串口调试助手后,原本之前该返回的数据全部依次返回到串口调试助手里面,怎么解释?
mosquit 2005-09-01
  • 打赏
  • 举报
回复
回复人: Practise_Think(时代“过客”)

你的程序还没配置好!!


哪里没有配置好,能指出来吗?
mosquit 2005-09-01
  • 打赏
  • 举报
回复
调试的时候应该是没有收到数据,因为在oncomm事件中加入了测试代码,结果引起oncomm的是事件3和5
Practise_Think 2005-08-31
  • 打赏
  • 举报
回复
你的程序还没配置好!!
loohe 2005-08-31
  • 打赏
  • 举报
回复
是调试的时候就没接收到数据呢?还是没有显示出来呢??
xzsxiao213 2005-08-31
  • 打赏
  • 举报
回复
不好意思,上面程序少了“}”
xzsxiao213 2005-08-31
  • 打赏
  • 举报
回复
最后记得加上
UpdateData(false);//更新显示
xzsxiao213 2005-08-31
  • 打赏
  • 举报
回复
在OnComm中添加如下代码:
CString ReceiveTemp;//用于存放接收的数据
CString strtemp;
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[1024]; //设置BYTE数组 An 8-bit integerthat is not signed.
if(m_Serial.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_Serial.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=1;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
ReceiveTemp+=strtemp;//可以添加一个编辑框,显示接受的数据
}
mosquit 2005-08-31
  • 打赏
  • 举报
回复
测试了一下,OnComm事件为3和5,没有2,而MSComm的说明中3和5事件解释如下:
comEvCTS 3 Change in Clear To Send line
comEvCD 5 Change in Carrier Detect line.
看来是CTS和CD引脚搞的鬼,要把它短接吗?为什么用串口调试助手就可以正常发收数据?

16,548

社区成员

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

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

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