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
**********************************************/ 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;
}
}
//发送函数里面
f(m_bSendEnable)
{
//add send byteroutine here
m_bSendEnable = FALSE;
}
//串口接收数据事件处理函数里面
//接收到数据之后,置位允许发送标志
m_bSendEnable = TRUE;
m_bSendEnable 初始化值为TRUE 串口API,进入中断,发送。 看看龚建伟的书或网站的例程。 谢谢,因为还有其他数据要处理,使用的是对话框。
对话框根据需要产生某些十六进制,然后发送给单片机,
单片机接收一个数据再写入EEPROM,写完后发送一个数据给上位机
上位机发送下一个字节十六进制数据。
我只是路过看看,别在意我的出现。 流式通讯要分帧,看看我刚发的帖子
页:
[1]