VC如何将串口返回的数据通过TCP/IP发送出去

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC如何将串口返回的数据通过TCP/IP发送出去相关的知识,希望对你有一定的参考价值。

UpdateData(TRUE);
if(!m_bLinked)

AfxMessageBox("没有连接网络!");
return;

if(m_ctrlPortON.GetCheck())

SerialSendData(m_strEditSendData);
int nPort=m_ctrlComPort.GetCurSel()+1;
CString str;
str.Format("通过COM%d发送",nPort);
str+=m_strEditPortData;
m_strEditPortData="";
// CString str;
// m_ctrlEditPortData.GetWindowText(str);
*(m_pMySocket->m_pCArcOut)<<str; // 向socket发送字符串
m_pMySocket->m_pCArcOut->Flush();
// Sleep(1000);
// m_pMySocket->Send(str,str.GetLength(),0);

else

*(m_pMySocket->m_pCArcOut)<<m_strEditSendData; // 向socket发送字符串
m_pMySocket->m_pCArcOut->Flush();


这是我写的部分代码,其中的问题就是发送跟接收总是慢一拍,即接收到的总是上一次发送的消息。实在不解,求高手!
萍水e相逢 你看过那书了吗,据我所知那本书在第9章只给了个简单例子,谈的只是皮毛(个人觉得)!而且我看的PDF电子版其中259页还没有!
hnjdbxf 这位仁兄,终于等到了人来了,先谢了!
UpdateData(TRUE);//一开始我就将控件对应的变量进行了更新
SerialSendData(m_strEditSendData);//这里完全没有问题
m_ctrlEditPortData.GetWindowText(str);//这个是我注释掉的,拜托!
代码不全的原因吧,m_strEditPortData这个是跟踪串口输出的变量。要发送的话完全没有必要UpdateData(FALSE)

期待与大侠的相逢!

参考技术A 之所以会慢一拍是因为下面两行
SerialSendData(m_strEditSendData);//变量被更新,但控件内容未变化
m_ctrlEditPortData.GetWindowText(str);//要不然UpdateData(FALSE)不就没用了?
参考技术B 推荐看 Visual C++_Turbo C串口通信编程实践

vc++ 6.0 串口通讯

【中文标题】vc++ 6.0 串口通讯【英文标题】:vc++ 6.0 serial communicaton 【发布时间】:2008-12-03 05:21:22 【问题描述】:

在 vc++ 中,我使用 MScomm 进行串行通信, 我收到了这种格式的数据 02120812550006050.0, 我不知道如何阅读它,它是什么格式, 开始帧和结束文件,我不知道。

编辑 1:

它包含日期时间和数据,我如何将其分开

【问题讨论】:

【参考方案1】:

有趣的字符是表示记录开始、记录结束、字段分隔符等内容的标记。在不知道实际协议的情况下,这有点难以分辨。

数据容易多了。

在 000f 和 0002 标记之间,您有一个日期/时间字段,即 2008 年 12 月 2 日 12:55:00。

在 0002 和 0003 标记之间,它看起来像一个简单的浮点数,实际上可能是美元值或任何东西,这取决于链接另一端的内容。

为了将其分开,我假设您已将其读入某种可变字符数组。只需查找标记并提取它们之间的字段。

日期/时间是固定大小的,值可能也是如此(因为它有一个前导 0),所以您可能只使用 memcpy 从缓冲区中提取您需要的信息,null 终止它们,转换将值设置为浮点数,瞧。

如果是固定格式,可以使用类似:

static void extract (char *buff, char *date, char *time, float *val) 
    // format is "\x01\x0fDDMMYYhhmmss\x02vvvvvvv\x03\x04"
    char temp[8];
    memcpy (date, buff +  2, 6); date[6] = '\0';
    memcpy (time, buff +  8, 6); time[6] = '\0';
    memcpy (temp, buff + 15, 7); temp[7] = '\0';
    *val = atof (temp);

并调用它:

char buff[26]; // must be pre-filled before calling extract()
char dt[8];
char tm[8];
float val;
extract (buffer, dt, tm, &val);

如果不是固定格式,你只需要编写代码来检测字段分隔符的位置并提取它们之间的内容。

【讨论】:

【参考方案2】:

除非您知道自己在与什么交流以及它如何与您交流,否则您不太可能弄明白。 (提示——你可以试着告诉我们)

【讨论】:

以上是关于VC如何将串口返回的数据通过TCP/IP发送出去的主要内容,如果未能解决你的问题,请参考以下文章

STM8s003 串口发送数据后不再接收

如何编程使上位机(界面c#)与下位机(单片机keil c)通过TCP/UDP协议来实现通信,最好有源代码,谢谢~~

TCP/IP协议 怎么用JAVA发送和接收二进制数据 要具体实例

VC串口通信问题

物联网串口服务器的功能和作用

如何通过tcp/ip协议读取西门子s7-300plc地址块的数据