小弟在做modbusrtu通信,使用149单片机定时发送数据帧,但是接收到到数据帧怎么都一样呢?
resvbuf[0]——resvbuf[8]接收到的是一样的16进制数据,不知道什么原因,还望高手给予指点!!!谢谢
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
DE;
uint i;
i=0;
while(i<8)
{
TXBUF1=sendbuf;
while(!(IFG2 & UTXIFG1));
IFG2 &= ~UTXIFG1;
i++;
}
RE;
}
void Set_UART1(void)
{
P3SEL |= 0xC0; //将P3.6,P3.7选做UART1的通信端口
ME2 |= UTXE1 + URXE1; //使能USART1的TXD和RXD
UCTL1 |= CHAR; //选择8-bit字符
UTCTL1 |= SSEL0; //驱动时钟选择ACLK
UBR01 = 0x03; //波特率9600
UBR11 = 0x00;
UMCTL1 = 0x6B; //调整
UCTL1 &= ~SWRST; //初始化UART状态机
IE2 |= URXIE1;
}
/*********异步接受中断***/
#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX (void)
{
uint j=0;
if (URXIFG1)
{
while(j<9)
{
resvbuf[j]=RXBUF1;
IFG2 &=~ URXIFG1 ;
j++;
}
}
}
[ 本帖最后由 Domosday 于 2013-12-8 09:27 编辑 ]
回复 楼主Domosday 的帖子
肯定会一样的。因为你是定时发送数据的,
while(j<9)
{resvbuf[j]=RXBUF1;//给数组赋值
IFG2&=~URXIFG1;//这句基本上没用,
j++;}//j自加,
没退出这一次接收到数据而进入的中断程序,却让j自加,肯定会让数组里数都一样。
建议,去掉while语句,j 设成全局变量或指针变量,进一次中断j加1,当j大于8时,让它等于0.
一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
回复 沙发jqh_111 的帖子
非常感谢版主,现在接受到的数据发生变化了,但是还是没有完成modbus rtu的通信,我使用的是一个149单片机读取一个带modbus rtu通信的温度传感器测量的温度值。发送的数据帧是
sendbuf[]={0x01,0x03,0x00,0x00,0x00,0x02,0xc4,0x0b};
但是接受的数据很乱,返回的数据帧格式跟modbus通讯完全不一致,不知道对于这个问题版主有何高见,小弟洗耳恭听!!!非常感谢~~~
回复 板凳qinkaiabc 的帖子
非常感谢版主,现在接受到的数据发生变化了,但是还是没有完成modbus rtu的通信,我使用的是一个149单片机读取一个带modbus rtu通信的温度传感器测量的温度值。发送的数据帧是
sendbuf[]={0x01,0x03,0x00,0x00,0x00,0x02,0xc4,0x0b};
但是接受的数据很乱,返回的数据帧格式跟modbus通讯完全不一致,不知道对于这个问题版主有何高见,小弟洗耳恭听!!!非常感谢~~~
回复 4楼Domosday 的帖子
楼主想用149的uart实现modbus rtu,这是两个不同的通信协议。modbus rtu只能半双工通信,通信方式是一根线,信号在这根线上往返传送信号。而uart可以全双工,至少得两根线,一根线负责往,一根线负责返。不知道楼主为何想要这么做。。
一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
回复 6楼jqh_111 的帖子
您好!是这样子的,我现在需要做温度监控,买了一个带485 modbus的温度传感器,想着就用149单片机接液晶显示和按键电路,把测试的温度使用液晶显示出来,因此才需要做modbus rtu 的通信!谢谢~另外如果使用485芯片的话,modbus通信也是两根线吧!?
[ 本帖最后由 Domosday 于 2013-12-7 09:21 编辑 ]
回复 7楼Domosday 的帖子
先不管485芯片,那只是让通信距离加长,和程序没什么关系。我说的几根线是针对传送数据来说的。它的通信像I2C通信,和从机地址有关。uart通信没从机地址这个概念,它的特点是双方波特率得尽量相同,保障他们收发数据正确。所以你这个是不能用uart来通信的,建议你参考modbus rtu或者i2c的驱动程序。加油吧。
一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
回复 8楼jqh_111 的帖子
非常感谢,还以为这块就是使用msp430的uart模块来进行通讯的呢,我再去查资料寻求解决办法!谢谢
可是modbus rtu的通信也是需要要求波特率要保持一致的,不知道这个波特率的设置方法是不是一样的呢?
其实还有一点,就是在查资料过程中,关于modbus通讯的程序大都使用的uart,不知道是不是自己理解
上有问题?还望您给与指点~谢谢
[ 本帖最后由 Domosday 于 2013-12-7 11:18 编辑 ]
回复 9楼Domosday 的帖子
你可不可以把你用的那个温度传感器的资料传上来。我想看看到底是怎么回事。。
一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
回复 10楼jqh_111 的帖子
您好,版主!很不好意思,没有及时给与您回复,我把那个温度传感器的资料给上传了,您看一下。那个采用的是DS18B20测温,51单片机,485 modbus rtu与外界通讯。您看一下,非常感谢您给予我的帮助飞,谢谢
回复 11楼Domosday 的帖子
资料我看了,通信确实是用UART。之前是我理解错了,非常抱歉。照目前的情况来看,你还没实现它两之间的通信,所以厂家那些默认的参数应该没变。你需要做的就是把波特率设为9600,发送八个字节的数据后,等待温度传感器返回数据,然后根据资料把数据进行变换得到正常的数据。从你写的程序来看,大致方向是对了的,不过你发送和接收都是9个字节的数据。你注意到了吗。TX,RX,DQ这三个引脚怎么连接的。
[ 本帖最后由 jqh_111 于 2013-12-8 19:06 编辑 ]
一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
回复 12楼jqh_111 的帖子
您好!版主~引脚是没有问题的,发送的是8个字节数据,接收的是9个字节数据!发送也是成功了,因为我发送的地址是0x01,能够接收到不断变化的数据,如果将地址改变为其他的,比如0x02,就没有接收到数据了,液晶函数也就没有显示。所以通讯应该是建立了,但是可能没有按照标准的modbus rtu 的通讯进行数据的收发,所以接收的数据跟想的不一样!自己也不知道怎么修改~希望版主能给出出主意~帮帮小弟!!!
[
本帖最后由 Domosday 于 2013-12-9 13:38 编辑 ]
回复 13楼Domosday 的帖子
那把你实验结果给我看看。你发的是什么数据,收到的又是什么数据。如果你这个比较急的话,建议多求助几个人,因为这里一发帖一回帖,效率很低。。。
一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
回复 14楼jqh_111 的帖子
谢谢您!我自己研究了一下,好像已经正常通讯了。还需要再验证一下,很感谢版主给予的帮助!!!