解决方案 »

  1.   

    测试发送800次01H,02H,04H,00H, 共计3200个数据,
    每个数据调用一次Sleep(1); 
    STC单片机接收后在串口中断函数中判断数据,
    接收到01H,点亮LED1,   02H点亮LED2, 04H点亮LED3, 00H全灭。
    循环800次后结束,用时5秒左右。,
    每个数据调用一次Sleep(1); 
    验证似乎没有问题,付VC和单片机源码。
    // newaDlg.cpp : implementation file
    /*2014 4 11 串口收发十六进制数据***/
    #include "stdafx.h"
    #include "dos.h"
    #include "newa.h"
    #include "newaDlg.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    /***********************************/
    class CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();
        enum { IDD = IDD_ABOUTBOX };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    protected:
    DECLARE_MESSAGE_MAP()
    };
    /***********************************/
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    //
    }
    /***********************************/
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }
    /***********************************/
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //
    END_MESSAGE_MAP()
    /***********************************/
    CNewaDlg::CNewaDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CNewaDlg::IDD, pParent)
    {
    m_count = _T("");
    m_recmess = _T("");
    m_sendmess = _T("");
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    /***********************************/
    void CNewaDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CNewaDlg)
    DDX_Control(pDX, IDC_COMSELECT, m_com);
    DDX_Control(pDX, IDC_SENDDATA, m_clrsend);
    DDX_Control(pDX, IDC_RECDATA, m_clrrec);
    DDX_Control(pDX, IDC_OPENSEND, m_OPENSEND);
    DDX_Control(pDX, IDC_MSCOMM1, m_Comm);
    DDX_Text(pDX, IDC_COUNT, m_count);
    DDX_Text(pDX, IDC_RECMESS, m_recmess);
    DDX_Text(pDX, IDC_SENDMESS, m_sendmess);
    //}}AFX_DATA_MAP
    }
    /***********************************/
    BEGIN_MESSAGE_MAP(CNewaDlg, CDialog)
    //{{AFX_MSG_MAP(CNewaDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_CBN_SELENDOK(IDC_COMSELECT, OnComselect)
    ON_BN_CLICKED(IDC_OPENSEND, OnOpensend)
    ON_BN_CLICKED(IDC_SENDDATA, OnSenddata)
    ON_BN_CLICKED(IDC_RECDATA, OnRecdata)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    /***********************************/
    BOOL CNewaDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
        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);
    }
    }
        SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon
    int i=9600;
        CString temp;
    temp.Format("%d,n,8,1",i);
    m_Comm.SetSettings(temp);
    m_com.SetCurSel(0);
    m_Comm.SetInputMode(1); //输入方式为二进制方式
    m_Comm.SetInBufferSize(1024); //设置输入缓冲区大小
    m_Comm.SetOutBufferSize(1024); //设置输出缓冲区大小,波特率4800无校验,8个数据位,2个停止位 
    m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
        m_Comm.SetSThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件
    m_Comm.SetInputLen(0);  //设置当前接收区数据长度为0
    m_Comm.GetInput();    //先预读缓冲区以清除残留数据
        if(!m_Comm.GetPortOpen())//判断串口的状态,如果是关闭状态,则打开
        m_Comm.SetPortOpen(TRUE);//打开串口
    return TRUE;  // return TRUE  unless you set the focus to a control
    }
    /***********************************/
    void CNewaDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    }
    /***********************************/
    void CNewaDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting
            SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
            int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2;
            dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    }
    /***********************************/
    HCURSOR CNewaDlg::OnQueryDragIcon()
    {
    return (HCURSOR) m_hIcon;
    }
    /***********************************/
    BEGIN_EVENTSINK_MAP(CNewaDlg, CDialog)
        //{{AFX_EVENTSINK_MAP(CNewaDlg)
    ON_EVENT(CNewaDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
    //}}AFX_EVENTSINK_MAP
    END_EVENTSINK_MAP()
    /***检测一个字符是不是十六进制字符,
    若是返回相应的值,否则返回0x10***/
    char HexChar(char c)
    {
    if((c>='0')&&(c<='9'))                  //
    return c-0x30;                          //数字0-9
    else if((c>='A')&&(c<='F'))             //
    return c-'A'+10;                        //大写A-F
    else if((c>='a')&&(c<='f'))             //
    return c-'a'+10;                        //小写a-f
    else return 0x10;                       //不符返回0X10
    }
    /***将一个字符串作为十六进制串转化为一个字节数组,字节间可用
    空格分隔,返回转换后的字节数组长度,同时字节数长度自动设置***/
    int Str2Hex(CString str,CByteArray &data)
    {
        int t,t1;                               //
    int rlen=0,len=str.GetLength();         //
    data.SetSize(len/2);                    //
    for(int i=0;i<len;)                     //
    {
    char l,h=str[i];                        //
    if(h==' ')                              //
    {
    i++;                                    //
    continue;                               //
    }
    i++;
    if(i>=len)break;                        //
    l=str[i];                               //
    t=HexChar(h);                           //
    t1=HexChar(l);                          //
    if((t==16)||(t1==16))                   //
    break;                                  //
    else t=t*16+t1;                         //
    i++;                                    //
    data[rlen]=(char)t;                     //
    rlen++;                                 //
    }                                       //
    data.SetSize(rlen);                     //
    return rlen;                            //返回长度
    }
    /***********************************/
    void CNewaDlg::OnComm() 
    {
    VARIANT m_input1;
    COleSafeArray m_input2;
    long length,i;
    BYTE data[1024];
    CString str;
    if(m_Comm.GetCommEvent()==2)                //接收缓冲区内有字符
    {
    m_input1=m_Comm.GetInput();                 //读取缓冲区内的数据
    m_input2=m_input1;                          //VARIANT变量转换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型变量
    {
    BYTE a=* (char *)(data+i);
    str.Format("%02X ",a);
    m_recmess+=str;
    }
    }
    UpdateData(FALSE);                          //更新编辑框内容
    }
    /***********************************/
    void CNewaDlg::OnComselect() 
    {
    int i=9600;                             //
        CString temp;                           //
    temp.Format("%d,n,8,1",i);              //
    m_Comm.SetSettings(temp);               //
    if(m_Comm.GetPortOpen())                //
        m_Comm.SetPortOpen(false);              //??
        m_Comm.SetCommPort(m_com.GetCurSel()+1);//
      }
    /***********************************/
    void CNewaDlg::OnOpensend() 
    {
    int count;
        count=0;
    do
    {
    count++;
        CString str_tmp;
        GetDlgItemText(count,str_tmp);
        str_tmp.Format(_T("%d"),count);
        SetDlgItemText(IDC_STATIC_1,str_tmp);
        if(!m_Comm.GetPortOpen())                  //检测串口是否打开
        m_Comm.SetPortOpen(TRUE);                   //打开串口
        CByteArray data;                            //定义位数组
        CString str;                                //定义字符串变量对象
        str = "01";                                 //字符串赋值
        int len=Str2Hex(str,data);                  //字符串转换十六进制
        m_Comm.SetOutput(COleVariant(data));        //发送数据
        Sleep(1);                                //等待
        str = "02";                                 //字符串赋值
        len=Str2Hex(str,data);                      //字符串转换十六进制
        m_Comm.SetOutput(COleVariant(data));        //发送数据
        Sleep(1);                                //等待
        str="04";                                 //字符串赋值
        len=Str2Hex(str,data);                      //字符串转十六进制
        m_Comm.SetOutput(COleVariant(data));        //发送数据
        Sleep(1);                                //等待
        str="00";                                 //字符串赋值
        len=Str2Hex(str,data);                      //字符串转十六进制
        m_Comm.SetOutput(COleVariant(data));        //发送数据
        Sleep(1);  
    }
    while(count<=800); 
    }
    /***********************************/
    void CNewaDlg::OnSenddata() 
    {
    m_sendmess= _T("");
        m_count = _T("");
        UpdateData(FALSE);
    }
    /***********************************/
    void CNewaDlg::OnRecdata() 
    {
        m_recmess = _T("");
        UpdateData(FALSE);
    }
    /***********************************/
    void CNewaDlg::OnOK() 
    {
    m_Comm.SetPortOpen(false);              //关闭串口
    CDialog::OnOK();
    }
    //////////////////////////////////////////////////////////////////////////////////
      

  2.   

    *********************************************/
              #include   "reg51.h"
              #include   "intrins.h"
              #define    uint unsigned int  
              #define    uchar unsigned char
      typedef    uchar BYTE;
              typedef    uint  WORD;
              #define    SLAVE 1                 //定义从机编号,0 为从机 1, 1 为从机 2
              #if        SLAVE==0
              #define    SAMASK 0x33             //从机 1 地址屏蔽位
              #define    SERADR 0x55             //从机 1 的地址为 xx01,xx01
              #define    ACKTST 0x78             //从机 1 应答测试数据
              #else
              #define    SAMASK 0x3C             //从机 2 地址屏蔽位
              #define    SERADR 0x5A             //从机 2 的地址为 xx01,10xx
              #define    ACKTST 0x49             //从机 2 应答测试数据
              #endif
              #define    URMD 2                  //0:使用定时器 2 作为波特率发生器
      sfr        AUXR=0x8e;              //辅助寄存器
              sfr        SADDR=0xA9;             //从机地址寄存器
              sfr        SADEN=0xB9;             //从机地址屏蔽寄存器
      char       count;
              sfr        P4=0xc0;
              sfr        P5=0xc8;
      sbit       out=P1^5;//
          sbit       out1=P4^5;//
              sbit       out2=P1^6;//
      sbit       out3=P1^7;//
      sbit       key1=P0^0;//
              sbit       key2=P0^1;//
      int        Buff;
      void       sw_out(unsigned char a);//开关量输出
    /*--------UART 中断服务程序-------------------*/
             void Uart() interrupt 4 using 1
              {
              if(RI)
               {
               Buff=SBUF;
               RI=0;
               }
      if(Buff==0x01)
               {
            out1=0;
        out2=1;
            out3=1;
           }
             else if(Buff==0x02)
           {
            out1=1;
        out2=0;
        out3=1;
           }
          else if(Buff==0x04)
           {
           out1=1;
       out2=1;
       out3=0;
           }
          else if(Buff==0x00)
           {
           out1=1;
       out2=1;
       out3=1;
           }
              }
    /*------------初始化串口---------------------*/
             void InitUart()
              {
               SADDR=SERADR;
               SADEN=SAMASK;
               SCON=0x50;                 //8位数据,可变波特率允许接收
               #if URMD==0
               T2L=0xDF;                        //设置波特率重装值
               T2H=0xFE;                        //9600bps(65536-11059200/4/9600)
               AUXR &=0x40;             //定时器1时钟为Fosc/12,即12T
           AUXR&=0xFE;                 //串口1选择定时器1为波特率发生器
               #elif URMD==1
               AUXR=0x40;                       //定时器 1 为 1T 模式
               TMOD=0x20;                 //设定定时器1为16位自动重装方式
           TL1=0xDF;                 //设定定时初值
           TH1=0xFE;                 //设定定时初值
           ET1=0;                     //禁止定时器1中断
           TR1=1;                     //启动定时器1
               #else
               TMOD=0x20;                       //设置定时器 1 为 8 位自动重装载模式
               AUXR=0x40;                       //定时器 1 为 1T 模式
       TL1=TH1=0xDB;                    // 9600 bps(256 - 11059200/32/9600)
               TR1=1;
               #endif
              }
    /*******************************************/
      void  delay(uint t) 
              { 
               uint i,j; 
               for(i=0;i<t;i++) 
               {
                for(j=0;j<121;j++); 
               } 
              }
    /*******************************************/
              void send(unsigned temp) 
                { 
                 unsigned serial;
         serial=temp;
         SBUF=(unsigned char)temp;
                 while(TI!=1);
         TI=0;
               }   
    /*******************************************/   
               void  main(void)   
              {   
               unsigned char a=255;    
       InitUart();                       //初始化串口
               ES = 1;
               EA = 1;                                 
               P0=0XFF;
       out1=0;
       out2=1;
       out3=1;
       delay(2000); 
       out1=1;
       out2=0;
       out3=1;
       delay(2000); 
       out1=1;
       out2=1;
       out3=0;
       delay(2000); 
       out1=1;
       out2=1;
       out3=1;
               while(1)
               {
    if(!key1) 
        {
        send(0X1F);
    out1=0;
    delay(1000);
    out1=1;
        }
       if(!key2) 
        {
        send(0XF1);
    out1=0;
    delay(10);
    out1=1;
        }
            out=0;
        delay(2000);
        out=1;   
    delay(2000);    
               }   
     }
      

  3.   

    做的测试,把01.02.04.00H用sleep函数间断发送出去,初步验证了一下,有什么逗不逗的?看着单片机点亮相对应的LED.刚开始sleep1000.具体每一段代码还没有仔细核查。
      

  4.   

    循环函数不能使用for的另一种方法。
      

  5.   

    对话框按键 的循环函数for中不能使用sleep的另一种方法。