读书人

串口通信速度的有关问题

发布时间: 2013-07-11 15:38:46 作者: rapoo

串口通信速度的问题

char str[100];  
memset(str,'\0',100);
DWORD wCount=100;//读取的字节数
BOOL bReadStat;

char lpOutBuffer[7];//?
memset(lpOutBuffer,'\0',7);//前7个字节先清零?
memset(lpOutBuffer,0xff,1);//
memset(lpOutBuffer+1,0x1b,1);//
memset(lpOutBuffer+2,0xa0,1);//
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;

ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);

if(!bWriteStat)
{
MessageBox("写串口失败!");
}

bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
{
MessageBox("读串口失败!");
}
PurgeComm(hCom,PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

m_fGongMoPing=(str[7]*16+str[8])/100;
m_fHuiLiuPing=(str[9]<<8+str[10]);
m_disp=str;
UpdateData(FALSE);




我写了一个串口通信程序,在我向下发送0xff 0x1b 0xa0以后可以收到一些信息,但是现在发送命令以后需要几十秒才能收到回复的信息,这个怎么加快啊?我用一些串口调试助手,都是很快就回复信息了,这个是我程序哪错了吗??
[解决办法]
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat) { MessageBox("写串口失败!"); }
Sleep(100);

bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat) { MessageBox("读串口失败!"); }
[解决办法]
9600 时 1ms 一个字节。
你是同步 读, 改 异步 读 试试
[解决办法]
bReadStat=ReadFile(hCom,str,wCount,&wCount111,NULL);
第四个参数好象是返回的实际读出字节数,第三个是要读取的字节数,这两个最好不要用一个变量,你实际读了几个字节,要看第四个参数,不是说你想发几个字节就一定是发了几个字节
另外,你读超时设置成1秒,不要设太小也不要设太大,1秒完全满足读取要求,同时两个字符时间间隔超时设成10毫秒或20毫秒
------解决方案--------------------


TimeOuts.ReadIntervalTimeout=MAXDWORD; MAXDWORD改成500试试. 在9600波特率下, 这个时间比较稳定.

这里有个类, 给你参考.
.h

#pragma once

#include <SetupAPI.h>

enum
{
LED_SUCCESS=0, //成功
LED_INIERRO=1, //初始化失败
LED_RDEMPTY=2, //读缓冲区为空
LED_RDTIMEOUT=3, //读取超时
LED_GETLENERRO=4, //ClearCommErro失败.
LED_PACKLENERRO=5, //包长错误
LED_RDBUFOVERFLOW=6, //读缓冲区不够大.
LED_CRCERRO=7, //CRC校验失败.
LED_WRITEERRO=8, //数据写入失败
LED_DATAERRO=9, //返回数据错误.
LED_TESTTING, //正在测试串口设备
};

void showErroCode(int nCode);
CString getErroString(int nCode);


class CAccessCom
{
public:
CAccessCom(void);
~CAccessCom(void);
private:
HANDLE m_hCurCom; //当前访问的com接口句柄.
DWORD m_inBuffSize;
DWORD m_outBuffSize;
DCB m_portDCB;
TCHAR m_curName[0x20];

public:
BOOL connectCom(LPCTSTR comName);
void closeCom();
UINT comRead(BYTE *outBuf,const DWORD nReadLen,DWORD &outLen,DWORD timeOut=1000);
UINT comWrite(const BYTE *wrBuf,DWORD wrLen,DWORD timeOut=1000);
void breakRead();
void breakWrite();
DWORD getRdSize();//获得输入缓冲区中的数据长度;
DWORD getWrSize();//获得输出缓冲区中的数据和度.
BOOL dcbDialog(HWND hParent);
int putChar(BYTE ch);
int getChar(BYTE &ch,int nTimeout=500);
void flushInput(void);

static void makeComName(TCHAR *nameBuff,int nMaxSize,int comNum);
public:
//清空输入缓冲区
inline void clearRdBuff()
{
PurgeComm(m_hCurCom,PURGE_RXCLEAR);

}

//清空输出缓冲区
inline void clearWrBuff()
{
PurgeComm(m_hCurCom,PURGE_TXCLEAR);
}

inline BOOL isOpen(){return m_hCurCom!=NULL;}

//设置串口输入输了缓冲区大小.
inline void setComBuffSize(DWORD inBuffSize,DWORD outBuffSize)
{
m_inBuffSize=inBuffSize;
m_outBuffSize=outBuffSize;
}
//设置串口参数
inline void setComState(DWORD baudRate,BYTE byteSize,BYTE parity,BYTE stopBits)
{

m_portDCB.BaudRate=baudRate;
m_portDCB.ByteSize=byteSize;
m_portDCB.Parity=parity;
m_portDCB.StopBits=stopBits;


}
//设置串口参数
inline void setComState(const DCB &dcb)
{
m_portDCB=dcb;
}
private:
//释放句柄
inline void releaseHandle(HANDLE &desHand)
{
if(desHand)
{
CloseHandle(desHand);
desHand=NULL;
}
}
};




[解决办法]
首先判断返回时,是否接收到了事件,是否延迟,

读书人网 >VC/MFC

热点推荐