共2条
1/1 1 跳转至页
uart0 uart0如何实现多机通讯

问
51实现多机通讯比较简单
不知道用LPC2210的uart0应该怎么实现
在线等待... 答 1: re: 定义合适的通讯协议(数据帧格式),所有从机都接收主机的数据帧,然后判断自己是否要响应即可。 答 2: 听说硬件方面不支持多机通信的,不用忙活了. 答 3: 谁说不支持,偏方一条:
第9位数据是奇偶校验位,用它!
发送数据(正确发送奇偶校验位,奇偶校验正常通过)
发送地址(强制改错奇偶校验位,让ARM从机检测到奇偶校验错误)
这不就区分开来了? 答 4: 用RS485了,接一个RS232转RS485的转接头 答 5: 只接485的转接头就可以吗 答 6: foyyof 这个方法妙!!支持!!1 答 7: RS485 Transceivers不要太多哦
我自己的板子就将UART0转成485去通讯,具体怎么做要看你的要求,通讯距离,还有节点数等等. 答 8: 多机通讯//485多机通讯
volatile uint32 AdressFrame; //地址帧标志
volatile uint32 ErrorFrame; //错误帧标志
uint8 s485[30];
void __irq IRQ_UART0(void) //另一节车电表数据传输
{
uint8 b1,b3,drc;
uint32 i;
b1=U0IIR;
b3=U0LSR;
TimeOutPtr=0; //在定时器中控制超时
switch(b1&0x0F)
{
case 0x06: //地址帧
if((b3&0x0E)==0x04)
{
RecivePtr=0;
AdressFrame=1;
}
else ErrorFrame=1;
break;
case 0x04: //数据帧
b1=U0RBR;
if(ErrorFrame==1) //错误数据,丢弃
{
ErrorFrame=0;
break;
}
if(RecivePtr==0)
{
if((AdressFrame==1)&&(b1==0x01))
{
s485[0]=0x01;
RecivePtr++;
}
}
else
{
s485[RecivePtr]=b1;
RecivePtr++;
}
AdressFrame=0;
break;
default:
b1=U0RBR;
break;
}
if(RecivePtr>=30)
{
DataOk=1; //进行数据处理
}
VICVectAddr=0x00;
}
void SendToAnother() //发送
{
uint32 i;
IO1SET=ENASEND; //切换到发送 //切换到发送
for(i=0;i<500;i++);
U0LCR=0x2B; //切换到发送地址帧 //输出地址
for(i=0;i<500;i++);
U0THR=0x01; //地址 //发送地址
while((U0LSR&0x40)==0);
for(i=0;i<4000;i++); //切换到发送数据
U0LCR=0x3B; //输出地址
for(i=0;i<500;i++); //输出数据
U0THR=0x02; //数据 //发送电量
while((U0LSR&0x40)==0);
for(i=0;i<4000;i++); //输入数据
IO1CLR=ENASEND;
for(i=0;i<500;i++);
i=U0IIR;
i=U0RBR;
i=U0LSR;
RecivePtr=0;
}
不知道用LPC2210的uart0应该怎么实现
在线等待... 答 1: re: 定义合适的通讯协议(数据帧格式),所有从机都接收主机的数据帧,然后判断自己是否要响应即可。 答 2: 听说硬件方面不支持多机通信的,不用忙活了. 答 3: 谁说不支持,偏方一条:
第9位数据是奇偶校验位,用它!
发送数据(正确发送奇偶校验位,奇偶校验正常通过)
发送地址(强制改错奇偶校验位,让ARM从机检测到奇偶校验错误)
这不就区分开来了? 答 4: 用RS485了,接一个RS232转RS485的转接头 答 5: 只接485的转接头就可以吗 答 6: foyyof 这个方法妙!!支持!!1 答 7: RS485 Transceivers不要太多哦
我自己的板子就将UART0转成485去通讯,具体怎么做要看你的要求,通讯距离,还有节点数等等. 答 8: 多机通讯//485多机通讯
volatile uint32 AdressFrame; //地址帧标志
volatile uint32 ErrorFrame; //错误帧标志
uint8 s485[30];
void __irq IRQ_UART0(void) //另一节车电表数据传输
{
uint8 b1,b3,drc;
uint32 i;
b1=U0IIR;
b3=U0LSR;
TimeOutPtr=0; //在定时器中控制超时
switch(b1&0x0F)
{
case 0x06: //地址帧
if((b3&0x0E)==0x04)
{
RecivePtr=0;
AdressFrame=1;
}
else ErrorFrame=1;
break;
case 0x04: //数据帧
b1=U0RBR;
if(ErrorFrame==1) //错误数据,丢弃
{
ErrorFrame=0;
break;
}
if(RecivePtr==0)
{
if((AdressFrame==1)&&(b1==0x01))
{
s485[0]=0x01;
RecivePtr++;
}
}
else
{
s485[RecivePtr]=b1;
RecivePtr++;
}
AdressFrame=0;
break;
default:
b1=U0RBR;
break;
}
if(RecivePtr>=30)
{
DataOk=1; //进行数据处理
}
VICVectAddr=0x00;
}
void SendToAnother() //发送
{
uint32 i;
IO1SET=ENASEND; //切换到发送 //切换到发送
for(i=0;i<500;i++);
U0LCR=0x2B; //切换到发送地址帧 //输出地址
for(i=0;i<500;i++);
U0THR=0x01; //地址 //发送地址
while((U0LSR&0x40)==0);
for(i=0;i<4000;i++); //切换到发送数据
U0LCR=0x3B; //输出地址
for(i=0;i<500;i++); //输出数据
U0THR=0x02; //数据 //发送电量
while((U0LSR&0x40)==0);
for(i=0;i<4000;i++); //输入数据
IO1CLR=ENASEND;
for(i=0;i<500;i++);
i=U0IIR;
i=U0RBR;
i=U0LSR;
RecivePtr=0;
}
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 |