一个串口的基础有关问题
一个串口的基础问题
最近刚接触串口,有些问题没搞明白
1,串口的工作原理是不是设备有数据时数据会先保留在串口,等程序执行ReadFile时再将数据复制到缓冲区?此时串口上的数据还在吗?是否要清除?
2,我在开发过程中初始化串口后,在串口设备发送数据,然后用ReadFile从串口读取数据,可以成功。但是我改成让一个ReadFile循环执行,希望当有串口有数据到来时接收数据,却一直接收不到数据。是不是我对串口理解出错了?
------解决方案--------------------
1、有缓冲区,而且缓冲区的大小可以设置
2、不知道你怎么做的
建议:你买一本VC串行口开发的书看看,这样学起来比较系统。
------解决方案--------------------
下面是我截取的,楼主自己看着改吧
CString strSQL;
_variant_t RecordsAffected;
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
m_sRXData= " ";
if(m_msComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
Sleep(20);//如果不延时,每次只能读8个字节
variant_inp=m_msComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k <len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k <len;k++) //将数组转换为Cstring型变量
{
RXDataBuffer[k]=rxdata[k];
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format( "%c ",bt); //将字符送入临时变量strtemp存放
m_sRXData+=strtemp; //加入接收编辑框对应字符串
}
------解决方案--------------------
用异步操作
用一循环检测WaitCommEvent和ClearCommError,然后可以判断有没有数据可读,有就读
你到网上查找CommTest程序源码,很容易解决的
最近刚接触串口,有些问题没搞明白
1,串口的工作原理是不是设备有数据时数据会先保留在串口,等程序执行ReadFile时再将数据复制到缓冲区?此时串口上的数据还在吗?是否要清除?
2,我在开发过程中初始化串口后,在串口设备发送数据,然后用ReadFile从串口读取数据,可以成功。但是我改成让一个ReadFile循环执行,希望当有串口有数据到来时接收数据,却一直接收不到数据。是不是我对串口理解出错了?
------解决方案--------------------
1、有缓冲区,而且缓冲区的大小可以设置
2、不知道你怎么做的
建议:你买一本VC串行口开发的书看看,这样学起来比较系统。
------解决方案--------------------
下面是我截取的,楼主自己看着改吧
CString strSQL;
_variant_t RecordsAffected;
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
m_sRXData= " ";
if(m_msComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
Sleep(20);//如果不延时,每次只能读8个字节
variant_inp=m_msComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k <len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k <len;k++) //将数组转换为Cstring型变量
{
RXDataBuffer[k]=rxdata[k];
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format( "%c ",bt); //将字符送入临时变量strtemp存放
m_sRXData+=strtemp; //加入接收编辑框对应字符串
}
------解决方案--------------------
用异步操作
用一循环检测WaitCommEvent和ClearCommError,然后可以判断有没有数据可读,有就读
你到网上查找CommTest程序源码,很容易解决的