我现在要用PC的串口和单片机进行通信,在PC上利用VC来做一个基于对话框的应用程序界面。界面上主要有两个按钮,一个control,向单片机发送控制命令,将界面上编辑框中的数据通过串口传递到单片机,实现对单片机的控制。另一个按钮是inquire,向单片机发送查询命令,将单片机中特定的数据发送给PC。
我本来打算用MSComm控件,但是不知道该怎么实现PC和单片机的握手。比如,点击按钮control,PC和单片机要首先进行握手,成功后PC再向单片机发送控制命令和数据。握手是PC向单片机发送一个特定的数据(数据1),如果单片机能正确接收,则向PC发送另一个特定数据(数据2),PC根据接收到的数据是否为数据2来判断握手是否成功,如果不成功则再发送数据1,等待单片机的响应。如果连续3次都不成功,则弹出控制失败的窗口。
现在的问题是PC重复发送数据1这个循环应该怎么写呢,如果写在按钮control的消息响应函数里,而判断握手成功需要根据串口接收的数据来判断,那么按钮control的消息响应函数中就要用到MSComm的消息响应了。这样可以吗?或者有什么别的方法吗,例如使用API串口通信函数。

解决方案 »

  1.   

    串口通信没搞过,你一定要用串口么? 用网络通信可以么?
     呵呵,我正在做 DSP 和 PC 端网络通信的,如果可以交流下,呵呵
      

  2.   

    楼主一定要先找本串口通信的书看看啊另外我要说的是,用MSCOMM控件完全可以,其实用哪种串口控件都无非是封装了串口发送,接收,和打开关闭串口这几个功能。。如果要实现你的功能,就要加一定的逻辑处理了,根据你的需求
    1.你要增加一个按钮和一个下拉框来打开串口吧
    2.建议增加一个用于发送握手报文的按钮,在向单片机发送 数据1 的时候,它会有回应吧,那么在MSCOMM控件的ONRECEIVED事件中,处理这个回应吧,如果正确回应,则把数据2发给单片机,如果又正确回应,那么就可以显示已成功握手了。
    关于你说的重复发送数据1的问题,有个关键点:就是发送数据1给单片机的时候,一定要给回应,要不然你怎么知道它正确接收了呢?如果没有正确接收,可以启动一个定时器来执行重复发送的任务;如果接收成功就可以发送数据2了。
      

  3.   

    有专门的串口通信的书
    http://www.du8.com/books/op00j7lt.shtml
    《Visual C++/Turbo C串口通信编程实践》
      

  4.   

    可以用网络上用的很多的CSerialPort类 封装过的API函数 很好用
      

  5.   

    谢谢大家的回复,特别是zhxingway,说的很详细。我确实很新手,也借了关于串口通信的书来看,包括上面朋友提到的那本书,之前也只看过MFC的一些内容,看来还是很不够用,因为涉及到线程的部分就不太懂了,看来要写一个简单的串口程序还是要涉及很多知识啊。
      

  6.   

    恩,谢谢楼上。我手头就有一本龚建伟的书,也在看。因为一会儿在看API,一会儿在看MSCOMM控件,所以感觉有点没有头绪。目前也就只仿照写了一个用串口发送HelloWord的程序。
    想请问使用API和MSCOMM控件的区别,是不是API函数需要考虑线程控制而MSCOMM控件就不需要?
      

  7.   

    您说的过程很详细,也给了我很大的启发,我之前看的一个例子也是类似的过程。关于重复发送数据1的问题,如果程序在一定时间内能够收到正确的回应那说明握手成功,如果收不到(包括回应错误或者没有收到回应),程序将再次发送握手的数据1。
    我设想的流程是这样:照您说的增加一个串口用于发送握手信号,在这个按钮的消息响应函数中发送握手信号并且启动计时(比如3S),那么3S后会产生一个事件Event1。而在事件Event1的消息响应函数中来读取串口的接收缓冲区,检查是否收到正确的来自单片机的回应信号。如果3次都没有接收到正确的回应信号则不再响应该事件。
      

  8.   

    我刚整串口的时候用的是MSCOMM 他比较简单 简单设置下串口就OK了 用API的话 灵活点 想读取几个数据 读多大都行
      

  9.   

    还是建议用VC串口类吧,用Activex控件的发布程序时很麻烦,还需要在目标电脑上安装mscomm控件