基于vc的上位机程序与下位机通信接收问题

qunying70703 2012-02-26 09:55:51
各位大侠好,本人用VC++编了一个与DSP通信的上位机程序,采用的MSCOMM控件,程序已编好,但测试老出问题,现把问题叙述如下:
刚开始测试的时候上位机发送数据在DSP里面可以接收到,接收数据就是接收不到,后来我把串口的两根线短接在一起,发送数据端发出数据,接收端也能接收到我要的数据,纠结了几天,不知道为什么连上DSP就接收不到,怀疑时接收问题,下位机已经看了好几遍,感觉没问题,不知各位大侠碰到过此种情况没?希望能给分析下毛病,不吝赐教
我的上位机要求就是接收我采集的电压电流信号,一种采集4组,加上通信协议两个字节一共接收10个字节,,现在把我接受代码附上一段,各位大侠给分析下有什么纰漏。
m_mscom.SetCommPort(myCom); //根据当前串口号选择所要打开的串口
m_mscom.SetPortOpen(true); //打开串口
m_mscom.SetSettings(strPara); //波特率,校验位,数据位,停止位设置
m_mscom.SetRThreshold(10); //参数10表示每当串口接收缓冲区中有多于或等于10个字符时,将引发一个接收数据的OnComm事件
m_mscom.SetInputMode(1); //设置数据获取方式2进制方式
m_mscom.SetInputLen(10); //每次从输入缓冲读取10个字符
m_mscom.GetInput(); //先预读缓冲区以清除残留数据
m_mscom.SetInBufferCount(0); //清空接收缓冲区


VARIANT variant_inp,variant_inp2;
COleSafeArray safearray_inp,safearray_inp2;
LONG len,k,i,j=0;
BYTE rxdata[2048],bt1; //设置BYTE数组 An 8-bit integer that is not signed.
CString strtemp,temp,strtemp2;
int a[4];

if(m_mscom.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
////////根据通信协议加入处理代码
variant_inp=m_mscom.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
if(len=10)
{
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k); //转换为BYTE型数组
for(i=0;i<len;i++)
{
BYTE bt=*(char*)(rxdata+i); //字符型
strtemp.Format(_T("%02x"),bt); //将字符以十进制方式送入临时变量strtemp存放,注意这里加入一个空隔
m_ReceiveData+=strtemp; //加入接收编辑框对应字符串
}

if((rxdata[0]==0xFF)&&(rxdata[1]==0x81))
{
{
a[0]=rxdata[2]*256+rxdata[3];
a[1]=rxdata[4]*256+rxdata[5];
a[2]=rxdata[6]*256+rxdata[7];
a[3]=rxdata[8]*256+rxdata[9];
}
本人分数不多了,希望路过的各位大侠同仁能畅所欲言。
不胜感激

...全文
562 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wshcdr 2012-03-08
  • 打赏
  • 举报
回复
帖还是先结了吧
hdg3707 2012-02-28
  • 打赏
  • 举报
回复
另个,可以响应编辑框控件的改变事件,名字忘了,可以双击这个编辑框控件就产生这个消息了.在这个消息里读取数据:
data=GetDlgItemint(IDC_EXIT1);//这是数值型
GetDlgItemText(IDC_EDIT1,data);//这是字符型的数据
hdg3707 2012-02-28
  • 打赏
  • 举报
回复
你接收到数据后是怎么显示的,看看显示部分,不是接收频率太快,肯定有哪块用到UpdateData()这个函数了.如果在接收到显示这部分没用到UpdateData()这个函数,就在resource.h这个文件里,看看有没有重复的ID,如果有就改成唯一个ID,也有可能是ID重复造成的,有时候ID会重复的,需要手工改
qunying70703 2012-02-28
  • 打赏
  • 举报
回复
怎么没人回复了呢?求回复
qunying70703 2012-02-28
  • 打赏
  • 举报
回复
非常感谢jennyvenus,Saleayas,yjukh,hdg3707的对本帖的支持回复,虽然上位机程序还有点小瑕疵,但自己也有了非常大的收获,其中最大的收获就是原来CSDN里隐藏了非常多的高手,以后我将继续借助CSDN的平台与人沟通交流,本帖将不结贴,只是希望更多的人参与其中
yjukh 2012-02-28
  • 打赏
  • 举报
回复
串口的确不能发送太快,一般发完一个包要Sleep一下,具体时间可以自己测
上位机可以直接给控件赋值啊
SetDlgItermInt之类
qunying70703 2012-02-28
  • 打赏
  • 举报
回复
void CMotormonitorDlg::OnChangeSpeed()
{
// TODO: Add your control notification handler code here
if(m_mscom.GetPortOpen())
{
CByteArray array;
array.RemoveAll();
array.SetSize(4);

UpdateData(TRUE);
BYTE GivenSpeedH,GivenSpeedL;
GivenSpeedH=m_GivenSpeed/256;
GivenSpeedL=m_GivenSpeed%256;

array[0]=0xFF;
array[1]=0x84;
array[2]=GivenSpeedH;
array[3]=GivenSpeedL;
// array[2]=0x0;
// array[3]=0x96;

m_mscom.SetOutput(COleVariant(array));
}
else
{
AfxMessageBox(_T("请先打开串口!"));
}
}
如上是我的上位机按钮响应消息函数,m_GivenSpeed是我定义的编辑框的变量。今天按照我的测试结果,上位机可以接收到我下位机发送的数据,但是编辑框里面始终输入不进去数据,每次输入数据都被刷新为零,(此时上位机也在不停接收下位机发送数据),后来我换了个下位机程序,这个程序是把下位机接收的数据发送给上位机,程序运行时,编辑框里面可以写入数据,也可以发送到上位机,证明我的函数应该没问题的,后来,把上位机中编辑框去掉,变量也删掉,直接给GivenSpeedH,GivenSpeedL赋值,这时,有了新的发现,继续运行我原来的下位机程序,上位机接受正常,但按钮需要点击三四次数据才能从上位机发送到下位机,不知道是不是频率太快造成的这种情况。
再次恳求各位学术大侠给点意见想法,本人不胜感激
hdg3707 2012-02-27
  • 打赏
  • 举报
回复
按楼上各位说的,一块一块调,等各部分都没问题了,再联调,这时如果有问题就是配合了,这就好改了
yjukh 2012-02-27
  • 打赏
  • 举报
回复
波特率、串口线、调试工具都很重要
qunying70703 2012-02-27
  • 打赏
  • 举报
回复
还是非常感谢,现在换了块开发板,准备重新测试下,下午把测试结果传上来,望各位大侠能及时回复
Saleayas 2012-02-27
  • 打赏
  • 举报
回复
一般来说,测试上下位机通信。
先使用工具测试你的下位机,完全通信成功后,在用来调试你的上位机。
不然你话,你都不知道错误在哪里。

加入下位机不是你开发的,你根本就无法证明是否是下位机的错误。

先使用串口精灵之类的调试你的开发板。
确认是 OK 了之后,在调试你的程序。
//如果你的程序功底足够深,就可以通过你的程序确定是上,还是下位机的问题了。//呵呵
qunying70703 2012-02-27
  • 打赏
  • 举报
回复
这位大侠,我上面的代码有没有纰漏?另外我试过用HelloDSP的串口软件调试过,一开始也可以发送接收,后来就不能发送接收了,程序是没问题的,现在就怀疑开发板了
用户 昵称 2012-02-27
  • 打赏
  • 举报
回复
你短接了之后, 当然就是自收自发了,解决问题要用可靠的部分来逐步定位,比如用一根经常测试的数据线。
换一个没问题软件向下发,来测试dsp有没有问题,dsp、数据线都没有问题,你才能确定是你软件有问题。
qunying70703 2012-02-27
  • 打赏
  • 举报
回复
我是用了UpdateData,但是只有在点击按钮时才会出现更新,我程序就是这么写的,偶尔能发送过去,而我换了一个简单一点的程序后,完全可以把数据写进去然后把数据发回来,不知道是不是因为接收数据频率太快造成写不进去。另外我的编辑框控件赋了一个变量,然后在按钮消息里读取该变量值,这样做应该没问题呀?
Saleayas 2012-02-27
  • 打赏
  • 举报
回复
你是不是绑定了编辑框?
那么如果你不停的 UpdateData,新填写进去的数据怎么保存呢?
qunying70703 2012-02-27
  • 打赏
  • 举报
回复
各位大侠,再次非常感谢你们的回复!
今天下午换了块开发板,可以接收发送数据了,但是随之出现了新的问题,在我连上DSP后,运行DSP程序时,程序不断地把数据发送到上位机中,上位机也能实时显示,但是上位机一个发送命令编辑框里面的数据却写不进去,上位机在接收时好像界面在不断刷新,但自己给定的数据写进去就立马刷新为零,不知道什么原因,希望碰到过类似情况的大侠能分享一下经验,没有碰到过此类问题的大侠大胆发挥下想象力,借助这个平台把我们都懂得给分享下,顺便也祝各位大侠事业有成!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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