串口通信错误解决办法

串口通信错误解决办法,第1张

写程序就是写逻辑,看你的表述,逻辑都已经很清晰了

给你个思路吧

假设 串口发送程序是Send(x),接收是 receive(),超时是 timeout

status SendFunction()

{

Send(x);

timeout = xxxx

SendCnt = 5

while(1)

{

if( timeout == 0 )

{

SendCnt --

Send(x)

timeout = xxxx

}

if( receive() == x )

{

return TRUE

}

if(( SendCnt == 0 )&&(timeout == 0))return FALSE

}

}

这个函数实现 串口发送 ,如果接收不到则最多发送5次,然后返回FALSE如果收到则退出此函数,返回TRUE

timeout是外部定时器处理的超时,此时间可依据接收方系统繁忙程度设定,假设发送一个字节是10ms,接收方最大的延时可能是8ms,则timeout 可以设定到20ms

注意: 这并非真实的代码,只是个大概的写法逻辑

接收方就不写了

讲一下大概思路

就是首先一个大循环

当你按下打开串口按钮时,进行判断是否有错误

如果有,则执行for循环,否则不执行,并且报错

当没有错误时,再按下打开串口则断开串口

当按下结束时程序结束

你好,希望我的回答能够对你有所帮助。

1.假如你现在正在学习VC串口编程,强烈建议你安装一个“虚拟串口软件vspdxp.exe”,再找个“sscom3.2串口通讯调试工具”。之后就可以完全用软件模拟串口通信来调试你的vc程序,很方便

2.我自己写了个程序实现你的要求,vc6下测试通过,工程下载地址:http://sites.google.com/site/qiujiejia1/Home/BaiDu_Answer_VC_SERIAL_2.zip

3. 萍水e相逢 推荐的 “ 龚建伟的个人主页,www.gjwtech.com ”绝对是学习串口通信的好网站,望有空多上去看看。

4.以下是主要代码,仅供参考。

/****************************************************************************

在OnInitDialog()里初始化

****************************************************************************/

BOOL CCommTest::OnInitDialog()

{

CDialog::OnInitDialog()

SetIcon(m_hIcon, TRUE) // Set big icon

SetIcon(m_hIcon, FALSE) // Set small icon

//Initial COM

m_ctrlComm.SetCommPort(1) //选择com1

m_ctrlComm.SetSettings("9600,n,8,1")//通信参数设置 波特率9600,无校验,8个数据位,1个停止位

m_ctrlComm.SetInBufferSize(1024) //指定接收缓冲区大小

m_ctrlComm.SetRThreshold(1) //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ctrlComm.SetInputMode(1) //定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。

m_ctrlComm.SetInputLen(0) //设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲 区中的全部内容。

m_ctrlComm.SetInBufferCount(0) //清空接收缓冲区

m_ctrlComm.SetPortOpen(TRUE) //打开串口

return TRUE // return TRUE unless you set the focus to a control

}

/****************************************************************************

接收函数

****************************************************************************/

void CCommTest::OnComm()

{

char Rec_Data_Array[2048] //用于接受数据

if (m_ctrlComm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符

{

VARIANT ReceiveData = m_ctrlComm.GetInput() //获取数据

int Data_Len = ReceiveData.parray->rgsabound->cElements//取出一维的数据个数

memcpy(Rec_Data_Array, (char*) ReceiveData.parray->pvData, Data_Len)//拷贝出数据

Rec_Data_Array[Data_Len] = 0

}

//将获取的字符串显示在edit框里

::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_RXDATA),Rec_Data_Array)

}

/****************************************************************************

发送函数

****************************************************************************/

void CCommTest::OnTransmit()

{

char buf[100]={0}

::GetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_TXDATA),buf,sizeof(buf))

m_ctrlComm.SetOutput(COleVariant(buf))//发送数据

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11278887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存