VC串口通信:用CSerialPort类实现的串口通信,如何实现PC端每隔一段时间给单片机发送数据

花花圆圆 2008-12-24 11:43:41
SMSPort是一个SerialPort类的对象

SMSPort.WritetoPort(数据);

Sleep(50);
SMSPort.WritetoPort(数据);
Sleep(50);
SMSPort.WritetoPort(数据);
Sleep(50);
SMSPort.WritetoPort(数据);

用Sleep延时每隔50ms向串口发送数据,可是只能接收到第一次和最后一次发的数据,中间的数据都丢失了,这是什么原因?该如何解决实现呢?望各位高手帮帮忙啊!谢谢!
...全文
826 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dou303 2010-07-11
  • 打赏
  • 举报
回复
这样就是不行的,用定时器可以解决部分问题
智能高科 2009-01-31
  • 打赏
  • 举报
回复
uchar data catch[100];
while(0 != WM_KEY_ASC)
{
SMSPort.WritetoPort(数据);

Sleep(50);
}
amarantine33520 2009-01-06
  • 打赏
  • 举报
回复
settimer
killtimer
ddszhan 2009-01-03
  • 打赏
  • 举报
回复
用Access Port监视一下,看看数据是不是真的发到串口里了,来确定是发送程序还是接收程序有问题。
YMIW163 2009-01-03
  • 打赏
  • 举报
回复
请问楼主这段串口类代码是不是从一本书那里得到的,还是从网上下载的.
这个类里的其实不会出现你那个现像,只是你在接收数据时的程序出问题.
根本就不是你那个发送程序的问题.SLEEP()是没问题的.
主要是在接收端是不是按消息接收,一旦有数据发送过时,就会响应一个接收事件.
只要处理这个接收事件就行了.
楼主可以看一下收数据是怎么收的就行了.只要弄明白就OK了.
这个类我也用过, 没问题啊.
davidzuo1022 2008-12-28
  • 打赏
  • 举报
回复
其实用WriteFile感觉上还更方便一点
wspjohny 2008-12-28
  • 打赏
  • 举报
回复
用定時查收。
glacierful 2008-12-25
  • 打赏
  • 举报
回复
最好不要采用这种sleep延时,不可靠。
把发送和接收放到线程里,然后用核心对象事件做同步,发送完后,用readfile逐字节读取,读完后再发送,这样交替进行。
还在查 2008-12-25
  • 打赏
  • 举报
回复
timer不能达到你要的精度要求,他本身存在误差(十多毫秒),你可以用线程写WaitForSingleObject(hEvent,time)
花花圆圆 2008-12-25
  • 打赏
  • 举报
回复
能不能给具体实现代码啊?
还在查 2008-12-25
  • 打赏
  • 举报
回复
可以的话把代码发给我看看,i03630211@163.com,这样没头没脑的搞不清楚
花花圆圆 2008-12-25
  • 打赏
  • 举报
回复
void CSerialPort::WriteChar(CSerialPort* port)
{
BOOL bWrite = TRUE;
BOOL bResult = TRUE;

DWORD BytesSent = 0;

ResetEvent(port->m_hWriteEvent);

// Gain ownership of the critical section
EnterCriticalSection(&port->m_csCommunicationSync);

if (bWrite)
{
// Initailize variables
port->m_ov.Offset = 0;
port->m_ov.OffsetHigh = 0;

// Clear buffer
PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

bResult = WriteFile(port->m_hComm, // Handle to COMM Port
port->m_szWriteBuffer, // Pointer to message buffer in calling finction
// strlen((char*)port->m_szWriteBuffer), // Length of message to send
port->m_nWriteSize, // Length of message to send
&BytesSent, // Where to store the number of bytes sent
&port->m_ov); // Overlapped structure

// deal with any error codes
if (!bResult)
{
DWORD dwError = GetLastError();
switch (dwError)
{
case ERROR_IO_PENDING:
{
// continue to GetOverlappedResults()
BytesSent = 0;
bWrite = FALSE;
break;
}
default:
{
// all other error codes
port->ProcessErrorMessage("WriteFile()");
}
}
}
else
{
LeaveCriticalSection(&port->m_csCommunicationSync);
}
} // end if(bWrite)

if (!bWrite)
{
bWrite = TRUE;

bResult = GetOverlappedResult(port->m_hComm, // Handle to COMM port
&port->m_ov, // Overlapped structure
&BytesSent, // Stores number of bytes sent
TRUE); // Wait flag

LeaveCriticalSection(&port->m_csCommunicationSync);

// deal with the error code
// if (!bResult)
{
// port->ProcessErrorMessage("GetOverlappedResults() in WriteFile()");
}
} // end if (!bWrite)

//Verify that the data size send equals what we tried to send
if (BytesSent != port->m_nWriteSize) // Length of message to send)
{
TRACE("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n", BytesSent, strlen((char*)port->m_szWriteBuffer));
}
// ::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_TXEMPTY_DETECTED, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);
// ::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_TXEMPTY_DETECTED,0,(LPARAM) port->m_nPortNr);
}
还在查 2008-12-25
  • 打赏
  • 举报
回复
你有时间精度要求吗
花花圆圆 2008-12-25
  • 打赏
  • 举报
回复
CSerialPort类里已经用writefile和readfile实现了数据的发送和接收啊,是基于多线程的,WritetoPort(数据)这个函数是直接触发写数据事件的,代码如下:

void CSerialPort::WriteToPort(char* string,int n)
{
assert(m_hComm != 0);

memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
// memset(m_szWriteBuffer, 0, n);
// strncpy(m_szWriteBuffer, string, n);
memcpy(m_szWriteBuffer, string, n);
m_nWriteSize=n;

// set event for write
SetEvent(m_hWriteEvent);
}
我用sleep的目的就是过一段时间再调用这个函数,但是数据就是丢了.如果数据都已经存到数组里,直接调用WriteToPort( string,4)是都可以发送出去的,但是我是想隔一段时间发送一个数据啊,不知道怎么实现了?各位大虾多多帮忙啊
ooily 2008-12-24
  • 打赏
  • 举报
回复
up
一条晚起的虫 2008-12-24
  • 打赏
  • 举报
回复
用Sleep延时每隔50ms向串口发送数据,可是只能接收到第一次和最后一次发的数据,中间的数据都丢失了,这是什么原因?
//接收程序是怎么样的?
ilovedrv 2008-12-24
  • 打赏
  • 举报
回复
用定时器
abcque 2008-12-24
  • 打赏
  • 举报
回复
用timer定时啊
花花圆圆 2008-12-24
  • 打赏
  • 举报
回复
我是在LONG CSerialPortTestDlg::OnComm(WPARAM ch, LPARAM port)里把接收到的数据显示在文本框内,就发现中间发的数据没有显示出来

我发的数据是按十六进制发送的,比如我要发的数据串是22,03,D3,82,先发22,隔一毫秒发03,就是每隔一毫秒发一个数据,该如何实现?

还在查 2008-12-24
  • 打赏
  • 举报
回复
还有可能就是你发送的数据是0,这是这个类存在的漏洞,当为0的时候它就不发了
加载更多回复(1)

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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