我的串口程序,有点问题,请大家帮忙休整一下:)
void CCommTestDlg::OnComm() //串口onComm事件
{
VARIANT m_input1;
COleSafeArray m_input2;
long length,i;
BYTE data[1024];
CString str;
if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符
{ MCommFlag=1;
m_input1=m_Comm.GetInput();//读取缓冲区内的数据
m_input2=m_input1;//将VARIANT型变量譥aa换为COleSafeArray型变量
length=m_input2.GetOneDimSize();//确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
for(i=0;i<length;i++)//将数组转换为Cstring型变量
{
char a=* (char *)(data+i);
str.Format("%c",a);
m_ReceiveData+=str;
}
}
UpdateData(FALSE);//更新编辑框内容
}
void CCommTestDlg::OnClear() //清除按扭
{
m_ReceiveData.Empty();//清除接收对话框中的数据
m_SendData.Empty();//清除发送对话框中的数据
UpdateData(FALSE);
}
BOOL CCommTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
MCommFlag=1;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
if(m_Comm.GetPortOpen())
{
m_Comm.SetPortOpen(FALSE); //设置串口配置信息前先要关闭串口
}
// unsigned int n=m_Comm.GetCommPort();
// CString com[2]={"1","2"};
//if (n!=NULL){
// AfxMessageBox(com[n-1]);}
m_Comm.SetCommPort(1); //Com1串行口
m_Comm.SetSettings("9600,n,8,1");//设置波特率为9600bps,无奇偶校验位,数据位8位,停止位1位
m_Comm.SetInputMode(1); //设置数据通讯格式为二进制数组格式
m_Comm.SetRThreshold(1); //设置为每次接到一个字节数据就触发OnComm事件
if(!m_Comm.GetPortOpen())
{
m_Comm.SetPortOpen(TRUE);
}
m_Comm.GetInput(); //清除串口输入缓冲区中残留数据
return TRUE; // return TRUE unless you set the focus to a control
}
void CCommTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
void CCommTestDlg::OnSend() //发送按扭的
{
if( !m_Comm.GetPortOpen() )
m_Comm.SetPortOpen(TRUE);//打开串口
UpdateData(TRUE);
/****************************************************************************/
//m_Comm.SetOutput(COleVariant(m_SendData));//原来的可以的
/************************************************************************/
//
//下面测试用的
/***********************************************/
int len=m_SendData.GetLength();
strcpy(m_pHexTemp,(LPTSTR)(LPCTSTR)m_SendData);//在发送区显示
char temp[10];
memset(temp,0,10);//为8个时有乱码
int i=0;
while(i<len)//数据每次送8个字节
{
if(MCommFlag==1)
{
MCommFlag=0;
for(int j=0;j<8;j++){
if(m_pHexTemp[i]!=NULL)
{temp[j]=m_pHexTemp[i];
i++;
}
else temp[j]=NULL;
}
UpdateData();
m_Comm.SetOutput(COleVariant(temp));//发送数据
/******************************/
AfxMessageBox(temp);//如果去掉,超过len>8时是死循环
//调试时无意中发现的
/********************************/
//unsigned long time=2000;//加延时也不行
// while(--time);
/****************************************/
}
}
}
/**********************************************************************/
另外定义了一个MCommFlag作为标志,和一个数组 char m_pHexTemp[80]
我的调试通过,不过我想把AfxMessageBox(temp)去掉也行该怎么办呀(用其他方法实现也可以)
在一个机子上把2,3脚接在一起即可。可以用圆珠笔的弹簧套住:)
其中有
两个EDIT 定义了CString
m_ReceiveData //显示收到数据
m_SendData //显示发送的数据
两个按钮
一个 发送 send
一个 清除 clear
一个Comm控件
定义了 m_Comm
程序全写出来了,请各位指教
有什么不对的都请指出来:)
谢谢了
我要把80个字节的数据
在一个循环里
分8次由串口送出
如果接受接收(定义了一个标志位)
就发送下面的8数据
一直到数据发送完毕
我用的是控件
可是我当发送完8个数据,发现并不触发OnComm事件
所以就成了死循环。
我该怎么办呀?