往串口写数据出现问题

aspvbjava 2006-03-27 01:03:57
我执行WriteFile写串口的时候失败,GetLastError()返回错误23------数据错误 (循环冗余检查)。
请问产生的原因是什么?产生这个错误以后我的串口似乎就不能写了,怎么样去掉这个错误?thanks!
...全文
292 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmzh 2006-04-03
  • 打赏
  • 举报
回复
SetCommTimeouts我试过可以,我的问题解决了
newcore 2006-03-30
  • 打赏
  • 举报
回复
会不会是底层的问题...
huguyue6670 2006-03-30
  • 打赏
  • 举报
回复
打开串口事不是有错?假如没有错232坏的情况很小,你应该设置一下串口,看看事不是能起作用?
一条晚起的虫 2006-03-30
  • 打赏
  • 举报
回复
串口本身出了问题了
cai114 2006-03-30
  • 打赏
  • 举报
回复
这个我也想知道,帮顶!
Atomictry 2006-03-30
  • 打赏
  • 举报
回复
把初始化函数全写出来。
aspvbjava 2006-03-28
  • 打赏
  • 举报
回复
郁闷,现在发现GetCommState后马上SetCommState就会出现错误(不修改m_dcb),不知道为什么了
aspvbjava 2006-03-28
  • 打赏
  • 举报
回复
这里,执行到SetCommState的时候出现错误,help, thanks
DCB m_dcb;
if (!(bRet = GetCommState(m_hCom, &m_dcb)))
return FALSE;

m_dcb.BaudRate = nBaudRate;
m_dcb.fBinary = 1;
m_dcb.fParity = 0;
m_dcb.fOutxCtsFlow = 0;
m_dcb.fOutxDsrFlow = 0;
m_dcb.fDtrControl = DTR_CONTROL_ENABLE;
m_dcb.fDsrSensitivity = 0;
m_dcb.fTXContinueOnXoff = 1;
m_dcb.fOutX = 0;
m_dcb.fInX = 0;
m_dcb.ErrorChar = 0;
m_dcb.fNull = 0;
m_dcb.fRtsControl = RTS_CONTROL_ENABLE;
m_dcb.fAbortOnError = 1;
m_dcb.fDummy2 = 0;
m_dcb.ByteSize = nDataSize;
m_dcb.Parity = nParity;
m_dcb.StopBits = nStopBit;

bRet = SetCommState(m_hCom, &m_dcb);
aspvbjava 2006-03-28
  • 打赏
  • 举报
回复
郁闷,今天执行SetupComm的时候GetLastError()总返回23
xmzh 2006-03-28
  • 打赏
  • 举报
回复
老兄;咱两个是难友阿!
咱两个的问题是一样的,不过有人建议用setcomtimesout试试,明天我试试看有没有结果。
kellyfly 2006-03-27
  • 打赏
  • 举报
回复
不知道你是第一次写入就错,还是长时间运行后出错。
CUG122032 2006-03-27
  • 打赏
  • 举报
回复
回个贴,试试,自己好像长星了...
forswear 2006-03-27
  • 打赏
  • 举报
回复
串口操作最好采用overlap
aspvbjava 2006-03-27
  • 打赏
  • 举报
回复
我使用while(1)循环不停的WriteFile,没有WaitForSingleObject,是不是不行啊?
bjskyhorse 2006-03-27
  • 打赏
  • 举报
回复
这样作个例子吧:
unsigned short gcWriteCommBlock( HANDLE portID, unsigned char *lpBuf, int *len )
{

DWORD tlen;

if( portID == INVALID_HANDLE_VALUE )
return CER_NOOPEN; // 串口未打开

PurgeComm( portID,
PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR ); // 清除输入输出缓冲BUF
if( !WriteFile( portID, lpBuf, *len, &tlen, NULL ) )
{
PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR );
*len = 0;
return CER_COMMUNICATE; // 通讯错误
}

if( tlen < (DWORD)(*len) )
{
PurgeComm( portID, PURGE_TXABORT | PURGE_TXCLEAR );
*len = tlen;
return CER_READERTIMEOUT; // Time out
}

return 0;
}
aspvbjava 2006-03-27
  • 打赏
  • 举报
回复
谢谢楼上,我没有使用overlap读写,不知道这样对不对
BOOL CSerial::Write(BYTE *pBuf, DWORD dwLen, DWORD *pWritten)
{
if(m_hCom == INVALID_HANDLE_VALUE)return FALSE;
int nRet = WriteFile(m_hCom, (void *)pBuf, dwLen, pWritten, NULL);
if(nRet != 0)
return TRUE;

Sleep(500);
int err = GetLastError(); //返回23

return FALSE;
}
一个傻冒 2006-03-27
  • 打赏
  • 举报
回复
是不是你串口出错以后,没有释放串口资源啊?
independently 2006-03-27
  • 打赏
  • 举报
回复
这是我写的串口类中的一部分:
HANDLE m_hComDev;// 串口设备句柄
OVERLAPPED m_osRead,m_osWrite;//头文件中如此定义
int CRs232::WriteCommBlock( LPCVOID lpByte, UINT nBytesToWrite)//向串口发送数据
{
int e_NotConnected =0;
int e_TransmitError =0;
int e_TransmitNotFinished =0;
DWORD dwBytesWritten, dwErrorFlags;
COMSTAT ComStat;
if( !m_bConnected ) // 串口没有打开
return e_NotConnected;
if(WaitForSingleObject(m_osWrite.hEvent,0) != WAIT_OBJECT_0)
return e_TransmitNotFinished;
ResetEvent(m_osWrite.hEvent);
if(!WriteFile(m_hComDev,lpByte,nBytesToWrite,&dwBytesWritten,&m_osWrite))
{
// 往串口发送数据
if( GetLastError() == ERROR_IO_PENDING )
return 0; // 正在后台发送
ClearCommError( m_hComDev, &dwErrorFlags, &ComStat ) ; // 出现错误,清除错误标志
return e_TransmitError; // 发送出错
}
return 0; // WriteFile返回1,发送成功}
}
C#串口介绍以及简单串口通信程序设计实现 源代码和串口程序介绍连接:https://www.cnblogs.com/JiYF/p/6618696.html 本站积分太贵,自己变得。。直接到连接地址下载代码 周末,没事干,个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍   串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度) 串口应用:   工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!你要是细心的话,你会发现,目前家用国网智能电能表就具备RS485通信总线(串行总线的一种)与RS232可以相互转化(当然一般,非专业的谁也不会闲的蛋疼,趴电表上瞎看,最多也就看看走了多少度电) RS232 DB9介绍: 1.示意图 2.针脚介绍: 载波检测(DCD) 接受数据(RXD) 发出数据(TXD) 数据终端准备好(DTR) 信号地线(SG) 数据准备好(DSR) 请求发送(RTS) 清除发送(CTS) 振铃指示(RI) 3.实物图: 以下是我购买XX公司的一个usb转串口线:这个头就是一个公头,另一端是一个usb口 笨小孩串口工具运行图: 1.开启程序 2.发送一行字符串HelloBenXH,直接将针脚的发送和接收链接起来就可以测试了(针脚2 接受数据(RXD) 和3 发出数据(TXD))直接链接, C#代码实现:采用SerialPort 1.实例化一个SerialPort [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 private SerialPort ComDevice = new SerialPort(); 2.初始化参数绑定接收数据事件 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 public void init() { btnSend.Enabled = false; cbbComList.Items.AddRange(SerialPort.GetPortNames()); if (cbbComList.Items.Count > 0) { cbbComList.SelectedIndex = 0; } cbbBaudRate.SelectedIndex = 5; cbbDataBits.SelectedIndex = 0; cbbParity.SelectedIndex = 0; cbbStopBits.SelectedIndex = 0; pictureBox1.BackgroundImage = Properties.Resources.red; ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件 }

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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