共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |