串口转发问题

时间:2021-03-19 13:36:54
连在同一台电脑上的两个串口之间如果不用线连接的话怎么相互转发数据?


我用的MSCOMM控件,比如有一台上位机连到我的串口1上,在程序中串口1收到上位机发来的数据,把数据转发到与串口2相连的另一台电脑上。串口1和串口2是本机的两个接口,物理上并不相连。

我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput,可是实验并不成功,不知哪位高人做过。还请指点一二。谢谢

16 个解决方案

#1


我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看

#2


原理上没问题,建议分开调试发送和接收。

#3


现成的商用程序,要不要?

功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中

能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端

http://shop36643368.taobao.com/

可到这里了解


#4


引用 1 楼 youyingbo 的回复:
我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看


首先感谢您的回复,我的串口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


引用 3 楼 saimen 的回复:
现成的商用程序,要不要?

功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中

能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端

http://shop36643368.taobao.com/

可到这里了解


不好意思,这个是自己做的。重在学习,不是应付交差的。谢谢

#6


引用 2 楼 jennyvenus 的回复:
原理上没问题,建议分开调试发送和接收。


呵呵,原理上想来可行,可是实现有问题,帮忙看下代码,我贴出来了。初学,呵呵。

#7


网上有现成的程序

#8


引用 7 楼 jyh_baoding 的回复:
网上有现成的程序


呵呵,没找到。可否给个链接?感谢。

#9


最后3句话:

return m_strCOM3RXData;

m_ctrCOM4.UpdateData(FALSE);

m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData)); 
----------------------

发送前就return了

#10


引用 9 楼 youyingbo 的回复:
最后3句话:

return m_strCOM3RXData;

m_ctrCOM4.UpdateData(FALSE);

m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
----------------------

发送前就return了


修改之后还是不可以,响应函数我改回了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串口通信编程实践>>

#12


是我的问题太白?

貌似回答建设性都不大。直接有人看出代码的问题了吗?直接了当一点吧,别装深沉。我初学。谢谢

#13


最后一句发送的时候,m_strCOM3RXData变量有东西吗?因为你放在if外边了,有没有东西都要发送

#14


引用 13 楼 youyingbo 的回复:
最后一句发送的时候,m_strCOM3RXData变量有东西吗?因为你放在if外边了,有没有东西都要发送


谢谢你的回复,响应过后m_strCOM3RXData里面肯定是有东西的,即使我放进if里面也不行。

#15


还是自己解决的,感谢热心回复的朋友。不过有的人别老在上面装深沉,大家不懂才问的,你会的说,不会的给点可用的建议,别再动不动让人去看书,学原理啊。你不告诉人家人家始终要解决问题的。

#16


楼主,我遇到的和你一样的问题,你是怎样解决的啊?急救啊

#1


我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看

#2


原理上没问题,建议分开调试发送和接收。

#3


现成的商用程序,要不要?

功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中

能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端

http://shop36643368.taobao.com/

可到这里了解


#4


引用 1 楼 youyingbo 的回复:
我的想法是在串口1的OnComm事件中加进串口2的发送函数SetOutput
--------------
这应是对的。
你首先要保证你得串口2可用,并且已经打开,或者设置是正确的。
你可以先用串口2发送一串自己随便定义的数据试试看


首先感谢您的回复,我的串口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


引用 3 楼 saimen 的回复:
现成的商用程序,要不要?

功能:
将通道1中收到的数据发到通道2中
将通道2中收到的数据发到通道1中

能力:
通道1,2支持:串口,网络TCP服务方式,TCP客户方案,管道服务端,管道客户端

http://shop36643368.taobao.com/

可到这里了解


不好意思,这个是自己做的。重在学习,不是应付交差的。谢谢

#6


引用 2 楼 jennyvenus 的回复:
原理上没问题,建议分开调试发送和接收。


呵呵,原理上想来可行,可是实现有问题,帮忙看下代码,我贴出来了。初学,呵呵。

#7


网上有现成的程序

#8


引用 7 楼 jyh_baoding 的回复:
网上有现成的程序


呵呵,没找到。可否给个链接?感谢。

#9


最后3句话:

return m_strCOM3RXData;

m_ctrCOM4.UpdateData(FALSE);

m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData)); 
----------------------

发送前就return了

#10


引用 9 楼 youyingbo 的回复:
最后3句话:

return m_strCOM3RXData;

m_ctrCOM4.UpdateData(FALSE);

m_ctrCOM4.SetOutput(COleVariant(m_strCOM3RXData));
----------------------

发送前就return了


修改之后还是不可以,响应函数我改回了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串口通信编程实践>>

#12


是我的问题太白?

貌似回答建设性都不大。直接有人看出代码的问题了吗?直接了当一点吧,别装深沉。我初学。谢谢

#13


最后一句发送的时候,m_strCOM3RXData变量有东西吗?因为你放在if外边了,有没有东西都要发送

#14


引用 13 楼 youyingbo 的回复:
最后一句发送的时候,m_strCOM3RXData变量有东西吗?因为你放在if外边了,有没有东西都要发送


谢谢你的回复,响应过后m_strCOM3RXData里面肯定是有东西的,即使我放进if里面也不行。

#15


还是自己解决的,感谢热心回复的朋友。不过有的人别老在上面装深沉,大家不懂才问的,你会的说,不会的给点可用的建议,别再动不动让人去看书,学原理啊。你不告诉人家人家始终要解决问题的。

#16


楼主,我遇到的和你一样的问题,你是怎样解决的啊?急救啊