czhaii 发表于 2014-4-12 18:11:48

VC连续发送十六进制数据怎么实现应答发送?

现在写了一段测试程序,利用延时实现发送一个十六进制再等待后发送
下一个十六进制数据,本意利用一个编辑框来作为标志显示,发送第一个
数据显示“A”,发送第一个数据显示“b”,发送第三个数据显示“C”,发送第
四个数据显示“D”,实际运行数据都可以发送,显示标志前面“ABC”不显示
最后一个"D"在发送完最后一位数据后显示了,运行标志显示不重要,主要
的数据可以正常发送了。
现在我想让电脑发送完一个数据后等待单片机返回
一个应答数据,再发送下一个数据,这样的程序该如何编写?
我想是不是给程序定义一个布尔变量,发送完设置0,接收到一个确认信号置1,
接着再发送下一位数据。
谢谢!


/***********************************/
void CNewaDlg::OnOpensend()
{
m_count = _T("");                                              //清空标志框
UpdateData(FALSE);                                        //更新编辑框内容
if( !m_Comm.GetPortOpen())                         //检测串口是否打开
m_Comm.SetPortOpen(TRUE);                  //打开串口
CByteArray data;                                                //定义位数组
CString str;                                                         //定义字符串变量对象
str = "01";                                                            //字符串赋值
int len=Str2Hex(str,data);                              //字符串转换十六进制
m_Comm.SetOutput(COleVariant(data));   //发送数据
m_count = _T("A");                                           //标志位显示
UpdateData(FALSE);                                    //更新编辑框内容
Sleep(5000);                                                    //等待
str = "02";                                                          //字符串赋值
len=Str2Hex(str,data);                                    //字符串转换十六进制
m_Comm.SetOutput(COleVariant(data)); //发送数据
m_count = _T("B");                                       //标志位显示
UpdateData(FALSE);                                     //更新编辑框内容
Sleep(5000);                                                   //等待
str = "04";                                                         //字符串赋值
len=Str2Hex(str,data);                                 //字符串转十六进制
m_Comm.SetOutput(COleVariant(data)); //发送数据
m_count = _T("C");                                        //标志位显示
UpdateData(FALSE);                                 //更新编辑框内容
Sleep(5000);                                                 //等待
str = "08";                                                      //字符串赋值
len=Str2Hex(str,data);                                  //字符串转十六进制
m_Comm.SetOutput(COleVariant(data)); //发送数据
m_count = _T("C");                                        //标志位显示
UpdateData(FALSE);                                 //更新编辑框内容
}
/***********************************/


STC15W1K16S和以上的通讯测试

/*********************************************
STC USB 串口板 2014 4 7 20:12 发送接收数据
使用STC串口调试助手通讯正常,L161
**********************************************/

czhaii 发表于 2014-4-12 18:12:58

STC USB 串口板 2014 4 7 20:12 发送接收数据
使用STC串口调试助手通讯正常,L161
       
          #include   "reg51.h"
          #include   "intrins.h"
          #define    uint unsigned int
          #define    uchar unsigned char
typedef    uchar BYTE;
          typedef    uintWORD;
          #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;
         }
          }
/*------------初始化串口---------------------*/
         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
          }
/*******************************************/
voiddelay(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;
         }          
/*******************************************/   
         voidmain(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(1000);
    out1=1;
    }
      sw_out(Buff);            //输出开关量   
   out=0;
    delay(2000);
    out=1;   
    delay(2000);   
                }   
}
/*******************************************/
   void sw_out(unsigned char a)
   {
   if(a==0x01)
              {
   out1=0;
   out2=1;
   out3=1;
   }
           else if(a==0x02)
   {
   out1=1;
   out2=0;
   out3=1;
   }
   else if(a==0x04)
   {
    out1=1;
    out2=1;
    out3=0;
    }
   else if(a==0x08)
   {
    out1=1;
    out2=1;
    out3=1;
   }
       }

mcu_lover 发表于 2014-4-12 19:17:07

//发送函数里面
f(m_bSendEnable)
{
    //add send byteroutine here

    m_bSendEnable = FALSE;
}

//串口接收数据事件处理函数里面
//接收到数据之后,置位允许发送标志
m_bSendEnable = TRUE;


m_bSendEnable 初始化值为TRUE

hqgboy 发表于 2014-4-14 10:55:17

串口API,进入中断,发送。

hqgboy 发表于 2014-4-14 10:55:34

看看龚建伟的书或网站的例程。

czhaii 发表于 2014-4-14 16:42:45

谢谢,因为还有其他数据要处理,使用的是对话框。
对话框根据需要产生某些十六进制,然后发送给单片机,
单片机接收一个数据再写入EEPROM,写完后发送一个数据给上位机
上位机发送下一个字节十六进制数据。

xuanfong1 发表于 2014-4-22 16:37:50

我只是路过看看,别在意我的出现。

gongxd 发表于 2014-4-22 17:20:05

流式通讯要分帧,看看我刚发的帖子
页: [1]
查看完整版本: VC连续发送十六进制数据怎么实现应答发送?