串口通讯的问题,向串口发送一字符串,包括0,怎么发送?急!!!

m0772 2003-07-11 03:53:42
通过超级终端来显示,我现在发送一正常字符串时没问题,但是要是字符串中含有0,0以后的字符就发不出去,该怎么解决?

我是通过WriteFile来发的。
...全文
559 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
let5flying 2003-10-30
  • 打赏
  • 举报
回复
To : : dailiangcm(dailiang)
可以给我一份吗???

zcsgh@163.com

谢谢~~~
mjznet 2003-07-12
  • 打赏
  • 举报
回复
我没用过CFile类,但C,C++有二进制方式的文件,就是为了解决特殊字符问题的.
zerphy 2003-07-11
  • 打赏
  • 举报
回复
是不是0表示结束符?
我爱VC,我爱PHP,我爱JAVA
m0772 2003-07-11
  • 打赏
  • 举报
回复
mengzhiren@sohu.com
澶氳阿锛? 鎴戠幇鍦ㄧ湅浜嗕竴涓嬶紝鍙兘鍙戝嚭鍘讳簡锛屼絾鏄垜瑙夊緱缁堢涓婃樉绀?鏄簲璇ユ槸涓€涓┖鏍硷紝浣嗘槸鏄剧ず鐨勬椂鍊?鍚庨潰鐨勫瓧绗︾洿鎺ユ樉绀哄湪鍓嶄竴涓瓧绗︾殑鍚庨潰锛
dailiangcm 2003-07-11
  • 打赏
  • 举报
回复
留下信箱,给你个class
无敌魔仙 2003-07-11
  • 打赏
  • 举报
回复
关注
mfc168 2003-07-11
  • 打赏
  • 举报
回复
BOOL WriteFile(
HANDLE hFile, // handle to file
LPCVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // number of bytes written
LPOVERLAPPED lpOverlapped // overlapped buffer
);
函数执行后,你可以比较两个值,nNumberOfBytesToWrite(in) 和lpNumberOfBytesWritten(out),如果这两个值不相等,则写的过程中丢字节了,但绝不可能因为字符‘0’,我觉得是终端显示的问题;如果真的是某个字符的原因也可以解决:在发送之前先将该字符以另一字符取代,并记录取代的位置,终端接收到后,根据所接收字符和记录的位置,重新改写,就可以了!
思危 2003-07-11
  • 打赏
  • 举报
回复
大致流程如下:

//打开串口
HANDLE m_hFile = CreateFile((LPCTSTR)m_strPort,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
if(m_hFile==INVALID_HANDLE_VALUE)
{
TRACE("端口无法打开!");
return;
}

//进行设置

DCB dcb;//DCB结构定义了串行通信的控制信息
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hFile,&dcb);//得到当前通信设备的控制信息

//设置波特率
dcb.BaudRate = 4800;
//设置通信位字节数
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;//设置校验方式,偶
dcb.StopBits = 1;//设置停止位字节数

dcb.fOutxDsrFlow = TRUE;
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;

dcb.fOutxCtsFlow = TRUE;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;

dcb.fOutxCtsFlow = FALSE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;

dcb.fInX = TRUE;
dcb.fOutX = TRUE;

dcb.XonChar = 0X11;
dcb.XoffChar = 0X13;
dcb.XonLim = 100;
dcb.XoffLim = 100;

dcb.fBinary = TRUE;
dcb.fParity = TRUE;

SetCommState(m_hFile,&dcb);//设置控制信息

COMMTIMEOUTS CommTimeOuts;//用于SetCommTimeouts和GetCommTimeouts函数来设置和获得通讯设备的超时参数
CommTimeOuts.ReadIntervalTimeout = 1000;
CommTimeOuts.ReadTotalTimeoutMultiplier = 12000/dcb.BaudRate + 1;
CommTimeOuts.ReadTotalTimeoutConstant = 1000;
CommTimeOuts.WriteTotalTimeoutMultiplier = 12000/dcb.BaudRate + 1;
CommTimeOuts.WriteTotalTimeoutConstant = 1000;

SetCommTimeouts(m_hFile,&CommTimeOuts);

SetupComm(m_hFile,2048,2048);//设输入输出缓冲大小

PurgeComm(m_hFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);//刷新输出缓冲区

//发数据
BYTE pSend[20];
memset(pSend, 1, 20);
DWORD dwLengthW = 0;
if(WriteFile(m_hFile,pSend,20,&dwLengthW,NULL)==FALSE)
{
DWORD dwErrorNo = GetLastError();
if(dwErrorNo)
{
TRACE("数据发送时错误,错误码:%lu",dwErrorNo);
}
}

//读数据
BYTE pRead[20];
memset(pRead, 0, 20);
DWORD dwLengthR = 0;
if(ReadFile(m_hFile,pRXData,10,&dwLengthR ,NULL)==FALSE)
{
DWORD dwErrorNo = GetLastError();
if(dwErrorNo)
{
TRACE("数据接收时错误,错误码:%lu",dwErrorNo);
}
}

// 关串口
EscapeCommFunction(m_hFile,CLRDTR);
PurgeComm(m_hFile,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
CloseHandle(m_hFile);

上面只是给出一个流程,很多参数事实上无须全部设置,如超时限制、DCB的某些成员等。

16,551

社区成员

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

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

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