单片机为51单片机,编程语言为Keil C51
问题如下:
我从串口接收6字节的字符串,然后将其原封不动的发还给源端,因为主程序机时的限制,无法用查询方式发送,必须在串口中断中发送。
问题急待解决,我的代码现在无法解决这个问题,请哪位大侠伸手拉我一把,先在这里谢了。下面是我的串口中断代码:
void UartInterrupt(void) interrupt 4 using 3
{
unsigned char dat;
if(RI)
{
RI = 0;
dat = SBUF;
scount = 0;
if(rstart)
{
if(dat == 0xfd && rcount == 5)
{
DBuff[5] = dat;
recieved = 1;
rstart = 0;
if(DBuff[4] == (DBuff[2] ^ DBuff[3]))
{
SBUF = DBuff[0];
scount = 1;
}
}
else if(dat == 0xfe)
{
DBuff[0] = dat;
rcount = 1;
}
else
{
if(rcount < 5)
{
DBuff[rcount++] = dat;
}
else
{
rcount = 0;
rstart = 0;
}
}
}
else
{
if(dat == 0xfe)
{
DBuff[0] = dat;
rcount = 1;
rstart = 1;
}
}
}
if(TI)
{
if(scount < 6)
{
SBUF = DBuff[scount];
TI = 0;
scount ++;
}
else
{
scount = 0;
TI = 0;
}
}
}
IF (TI)
后面那个ELSE就不要了吧?
你装好数据后
TI = 1;
/******************************************************************************
仅限于:
串口方式1的工作模式,即1位起始位,8位数据位和1位停止位,无校验位,波特率不倍增
******************************************************************************/
typedef enum tagBAUD
{
b_1200 = 1200,
b_2400 = 2400,
b_4800 = 4800,
b_9600 = 9600,
// b_19200 = 19200,
INVALID_BAUD,
}BAUD;
如果工作在115200怎么办?
引用: 引用 5 楼 lbing7 的回复:
/******************************************************************************
仅限于:
串口方式1的工作模式,即1位起始位,8位数据位和1位停止位,无校验位,波特率不倍增
******************************************************************************/
typedef enum tagBAUD
{
? ? b_1200 = 1200,
? ? b_2400 = 2400,
? ? b_4800 = 4800,
? ? b_9600 = 9600,
//? ? b_19200 = 19200,
? ? INVALID_BAUD,
}BAUD;
如果工作在115200怎么办?
没问题,但是需要自己改动一些设置。因为我用的串口一般9600足矣。
enmu的数据类型本质是啥?
有多少长度?不溢出?
是哈,据说以前有一个视频语音通信系统的通信速率才1200呢
引用: 引用 7 楼 lbing7 的回复:
enmu的数据类型本质是啥?
有多少长度?不溢出?
是哈,据说以前有一个视频语音通信系统的通信速率才1200呢
你sizeof一下自然就知道了。
在keil的帮助文档里写的很清楚:The enum keyword defines set of constants of type
char or type
int depending on the range of values of the set.
谢谢jiqiang,问题我现在解决了,发送还是利用主程序发送的。楼上的代码发送字节的代码估计也需要在主函数中调用。不过帖子我还是结了,还望高手们以后对我多多帮助。