我的串口程序,有点问题,请大家帮忙休整一下:)

shyfish 2004-07-22 12:27:59
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事件
所以就成了死循环。
我该怎么办呀?


...全文
77 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsys2000 2004-07-26
  • 打赏
  • 举报
回复
mark
happyprince 2004-07-26
  • 打赏
  • 举报
回复
我用MSCOMM控制MODEM的时候也曾经出现此类问题,至今不知道原因,帮你顶,关注……
phant 2004-07-26
  • 打赏
  • 举报
回复
我从来不用MSCOMM,在www.codeproject.com上找一个好用的串口类就行了,用不了几行代码。这会我不能出国,你找一个分值高的一定好用。
aoxue 2004-07-26
  • 打赏
  • 举报
回复
楼上太恐怖了啊
我都头大。。。。。。。
danielzhu 2004-07-25
  • 打赏
  • 举报
回复
我不会MSCOMM

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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