我用的MSCOMM控件,比如有一台上位机连到我的串口1上,在程序中串口1收到上位机发来的数据,把数据转发到与串口2相连的另一台电脑上。串口1和串口2是本机的两个接口,物理上并不相连。
我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput,可是实验并不成功,不知哪位高人做过。还请指点一二。谢谢
16 个解决方案
#1
我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看
#2
原理上没问题,建议分开调试发送和接收。
#3
现成的商用程序,要不要?
功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中
能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端
http://shop36643368.taobao.com/
可到这里了解
功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中
能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端
http://shop36643368.taobao.com/
可到这里了解
#4
首先感谢您的回复,我的串口2是可以用的,也可以另一台机子上物理相连的串口的进行通信。设置各方面都可以的。我现在就是从串口1接收到的最简单的字符串,想转发到串口2,通过串口2再转发到下位机上。
我把代码贴出来,大家帮忙看下:
CString CCommTestDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearry_inp;
LONG len, k;
BYTE rxdata[2048];
CString strtemp;
if (m_ctrCOM3.GetCommEvent() == 2)
{
variant_inp = m_ctrCOM3.GetInput();
safearry_inp = variant_inp;
len = safearry_inp.GetOneDimSize();
for (k = 0; k < len; ++k)
{
safearry_inp.GetElement(&k, rxdata + k);
}
for (k = 0; k < len; ++k)
{
BYTE bt = *(char*)(rxdata + k);
strtemp.Format("%c", bt);
m_strCOM3RXData += strtemp;
}
}
UpdateData(FALSE);
return m_strCOM3RXData;
m_ctrCOM4.UpdateData(FALSE);
m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
}
#5
不好意思,这个是自己做的。重在学习,不是应付交差的。谢谢
#6
呵呵,原理上想来可行,可是实现有问题,帮忙看下代码,我贴出来了。初学,呵呵。
#7
网上有现成的程序
#8
呵呵,没找到。可否给个链接?感谢。
#9
最后3句话:
return m_strCOM3RXData;
m_ctrCOM4.UpdateData(FALSE);
m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
----------------------
发送前就return了
return m_strCOM3RXData;
m_ctrCOM4.UpdateData(FALSE);
m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
----------------------
发送前就return了
#10
修改之后还是不可以,响应函数我改回了VOID型,不要返回值,还是不能实现,还请高人指点。
另外我用CSerialPort类实现,也同样遇到了问题,部分代码如下:
if (m_canSendToPort3.GetCheck()) //m_canSendToPort3是一个复选框的变量,如果选择了,就是把本串口收到的数据转发到串口3
{
m_nCom = m_ctrlPort.SetCurSel(2);
if (m_SerialPort.InitPort(this, m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512))
{
m_SerialPort.StartMonitoring();
m_SerialPort.WriteToPort(m_sRxEdit, m_sRxEdit.GetLength()); // 主要是这句转发,应该有问题
}
else
{
AfxMessageBox("串口不存在或已被占用!");
}
#11
首先你说的功能,完全可以实现.
但是不赞成用MSCOM控件,关于串口通迅网上实在太多资料和源码了,
如果你还是没有搞懂,建议买这本书<<VC/TC串口通信编程实践>>
但是不赞成用MSCOM控件,关于串口通迅网上实在太多资料和源码了,
如果你还是没有搞懂,建议买这本书<<VC/TC串口通信编程实践>>
#12
是我的问题太白?
貌似回答建设性都不大。直接有人看出代码的问题了吗?直接了当一点吧,别装深沉。我初学。谢谢
貌似回答建设性都不大。直接有人看出代码的问题了吗?直接了当一点吧,别装深沉。我初学。谢谢
#13
最后一句发送的时候,m_strCOM3RXData变量有东西吗?因为你放在if外边了,有没有东西都要发送
#14
谢谢你的回复,响应过后m_strCOM3RXData里面肯定是有东西的,即使我放进if里面也不行。
#15
还是自己解决的,感谢热心回复的朋友。不过有的人别老在上面装深沉,大家不懂才问的,你会的说,不会的给点可用的建议,别再动不动让人去看书,学原理啊。你不告诉人家人家始终要解决问题的。
#16
楼主,我遇到的和你一样的问题,你是怎样解决的啊?急救啊
#1
我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看
#2
原理上没问题,建议分开调试发送和接收。
#3
现成的商用程序,要不要?
功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中
能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端
http://shop36643368.taobao.com/
可到这里了解
功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中
能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端
http://shop36643368.taobao.com/
可到这里了解
#4
首先感谢您的回复,我的串口2是可以用的,也可以另一台机子上物理相连的串口的进行通信。设置各方面都可以的。我现在就是从串口1接收到的最简单的字符串,想转发到串口2,通过串口2再转发到下位机上。
我把代码贴出来,大家帮忙看下:
CString CCommTestDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearry_inp;
LONG len, k;
BYTE rxdata[2048];
CString strtemp;
if (m_ctrCOM3.GetCommEvent() == 2)
{
variant_inp = m_ctrCOM3.GetInput();
safearry_inp = variant_inp;
len = safearry_inp.GetOneDimSize();
for (k = 0; k < len; ++k)
{
safearry_inp.GetElement(&k, rxdata + k);
}
for (k = 0; k < len; ++k)
{
BYTE bt = *(char*)(rxdata + k);
strtemp.Format("%c", bt);
m_strCOM3RXData += strtemp;
}
}
UpdateData(FALSE);
return m_strCOM3RXData;
m_ctrCOM4.UpdateData(FALSE);
m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
}
#5
不好意思,这个是自己做的。重在学习,不是应付交差的。谢谢
#6
呵呵,原理上想来可行,可是实现有问题,帮忙看下代码,我贴出来了。初学,呵呵。
#7
网上有现成的程序
#8
呵呵,没找到。可否给个链接?感谢。
#9
最后3句话:
return m_strCOM3RXData;
m_ctrCOM4.UpdateData(FALSE);
m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
----------------------
发送前就return了
return m_strCOM3RXData;
m_ctrCOM4.UpdateData(FALSE);
m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
----------------------
发送前就return了
#10
修改之后还是不可以,响应函数我改回了VOID型,不要返回值,还是不能实现,还请高人指点。
另外我用CSerialPort类实现,也同样遇到了问题,部分代码如下:
if (m_canSendToPort3.GetCheck()) //m_canSendToPort3是一个复选框的变量,如果选择了,就是把本串口收到的数据转发到串口3
{
m_nCom = m_ctrlPort.SetCurSel(2);
if (m_SerialPort.InitPort(this, m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512))
{
m_SerialPort.StartMonitoring();
m_SerialPort.WriteToPort(m_sRxEdit, m_sRxEdit.GetLength()); // 主要是这句转发,应该有问题
}
else
{
AfxMessageBox("串口不存在或已被占用!");
}
#11
首先你说的功能,完全可以实现.
但是不赞成用MSCOM控件,关于串口通迅网上实在太多资料和源码了,
如果你还是没有搞懂,建议买这本书<<VC/TC串口通信编程实践>>
但是不赞成用MSCOM控件,关于串口通迅网上实在太多资料和源码了,
如果你还是没有搞懂,建议买这本书<<VC/TC串口通信编程实践>>
#12
是我的问题太白?
貌似回答建设性都不大。直接有人看出代码的问题了吗?直接了当一点吧,别装深沉。我初学。谢谢
貌似回答建设性都不大。直接有人看出代码的问题了吗?直接了当一点吧,别装深沉。我初学。谢谢
#13
最后一句发送的时候,m_strCOM3RXData变量有东西吗?因为你放在if外边了,有没有东西都要发送
#14
谢谢你的回复,响应过后m_strCOM3RXData里面肯定是有东西的,即使我放进if里面也不行。
#15
还是自己解决的,感谢热心回复的朋友。不过有的人别老在上面装深沉,大家不懂才问的,你会的说,不会的给点可用的建议,别再动不动让人去看书,学原理啊。你不告诉人家人家始终要解决问题的。
#16
楼主,我遇到的和你一样的问题,你是怎样解决的啊?急救啊