单片机串行口发送多位数据程序
求一单片机c程序:要求是把A单片机中的两个八位二进制数发送到B单片机中。因为单片机的串口一帧只发八位,我主要是不知道怎么连续传送两个数据,还要用B机来显示,不过我不需要现...
求一单片机c程序:要求是把A单片机中的两个八位二进制数发送到B单片机中。因为单片机的串口一帧只发八位,我主要是不知道怎么连续传送两个数据,还要用B机来显示,不过我不需要现实的程序,只要成功发送到B得程序就好。。。谢谢啦。。。
题目应该是发送多个数据吧,呵呵 展开
题目应该是发送多个数据吧,呵呵 展开
展开全部
想要发送多次,来传送一个数据,就必须自己制定协议。
一个简单的方法是:
把“两个八位二进制数”先拆成“四个四位二进制数”,分成四次进行传送。
每次传送,用低四位来表示“一个四位二进制数”,用高四位来表示“第几个”。
接收方再根据高四位的信息,把低四位拼凑成“两个八位二进制数”。
这种方法,最大可以传送64位数的数据,即一个“八个八位二进制数”。
一个简单的方法是:
把“两个八位二进制数”先拆成“四个四位二进制数”,分成四次进行传送。
每次传送,用低四位来表示“一个四位二进制数”,用高四位来表示“第几个”。
接收方再根据高四位的信息,把低四位拼凑成“两个八位二进制数”。
这种方法,最大可以传送64位数的数据,即一个“八个八位二进制数”。
追问
恩,理解一点不过我对c程序运用还不熟,可以传段程序看看吗?
追答
c程序运用还不熟,那就用汇编吧。
汇编特简单。
展开全部
传个程序给你参考吧
//这个是AVR单片机的,
void Putchar(char c) //串口0发送字符
{
while(!(UCSR1A&(1<< UDRE1))); //
UDR1=c;
}
//******51单片机
void Putchar(char c) //串口0发送字符
{
ES=0;//如果开了中断的话,要先关闭中断
SBUF=c;
while(!TI);//
TI=0;
ES=1;//如果开了中断的话,恢复中断
}
void Putstring(unsigned char *p,unsinged int n){
while(n--){
Putchar(*p);
}
}
void main(void){
unsigned char table[5];
...
.while(1){
...//其他程序
Putstring(table,2);//发送2个字节
...
}
}
接收程序的话,最好使用中断,并且有一定的协议,比如首字节就是发送数据的个数
这样的话,接收了多少个以后,就做一个标记位,表示接收完毕,
下面这个程序是指每次发送的数据时固定个数的9个,并且以0x0d作为第一个字符的AVR接收程序
SIGNAL(SIG_UART1_RECV)
{
unsigned char Recdata;
Recdata=UDR1;
if(Recdata==0x0d)RecCnt=0;
UART_RxBuf[RecCnt++]=Recdata;
if(RecCnt>=0x09){
UartRec_f=1;
RecCnt=0;
DIS_UART1();
}
}
不要协议的话,也可以 通过延时的方法来实现,比如延时多长时间没有收到数据,就表示接收完毕
//这个是AVR单片机的,
void Putchar(char c) //串口0发送字符
{
while(!(UCSR1A&(1<< UDRE1))); //
UDR1=c;
}
//******51单片机
void Putchar(char c) //串口0发送字符
{
ES=0;//如果开了中断的话,要先关闭中断
SBUF=c;
while(!TI);//
TI=0;
ES=1;//如果开了中断的话,恢复中断
}
void Putstring(unsigned char *p,unsinged int n){
while(n--){
Putchar(*p);
}
}
void main(void){
unsigned char table[5];
...
.while(1){
...//其他程序
Putstring(table,2);//发送2个字节
...
}
}
接收程序的话,最好使用中断,并且有一定的协议,比如首字节就是发送数据的个数
这样的话,接收了多少个以后,就做一个标记位,表示接收完毕,
下面这个程序是指每次发送的数据时固定个数的9个,并且以0x0d作为第一个字符的AVR接收程序
SIGNAL(SIG_UART1_RECV)
{
unsigned char Recdata;
Recdata=UDR1;
if(Recdata==0x0d)RecCnt=0;
UART_RxBuf[RecCnt++]=Recdata;
if(RecCnt>=0x09){
UartRec_f=1;
RecCnt=0;
DIS_UART1();
}
}
不要协议的话,也可以 通过延时的方法来实现,比如延时多长时间没有收到数据,就表示接收完毕
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从你出现的问题看,你应该是发的0,1,2,3……255的数,而不是它们对应的ASCII的值。比如你要发送在串口调试工具中显示0,应该发送0的ASCII值;假设你的串口发送一字节的函数为:sendbyte(unsigned char n);
则发送函数可以这样写:
void send(void)
{
unsigned char i;
for (i=0;i<256;i++)
{
sendbyte(n/100+'0');
sendbyte(n%100/10+'0');
sendbyte(n%100%10+'0');
}
}
去掉16进制显示,就能看到0-255的显示了
则发送函数可以这样写:
void send(void)
{
unsigned char i;
for (i=0;i<256;i++)
{
sendbyte(n/100+'0');
sendbyte(n%100/10+'0');
sendbyte(n%100%10+'0');
}
}
去掉16进制显示,就能看到0-255的显示了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询