威纶通官方论坛

STC单片机MODBUS RTU 通信求助,TK6070IH窜口调试正常,连不上,附源码

[复制链接]
发表于 2012-11-19 00:45:55 | 显示全部楼层 |阅读模式
本帖最后由 buyiro 于 2012-11-19 00:49 编辑

已经调试好几天了,心都碎了
求帮助
#include<STC_NEW_8051.H> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        
#include<main.H>

#define FOSC 11059200L
#define BAUD 9600
#define addr        0x01

#define ReadReg         0x03 // 6X read input register读寄存器
#define WriteReg        0x06 // 6X write multi register写寄存

uint16 Reg0,Reg1,Reg2;

sbit s485=P0^0;
uint8        idata sendBuf[16],receBuf[16]; //发送接收缓冲区
int         sendPosi,sendCount;receCount;
int                receOK,rtime;

/*------------------------------------------------
                   函数声明
------------------------------------------------*/
void SendStr(void);
void MODBUS(void);

/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收
        AUXR = 0x15;                //串口1独立波特率发生器工作在1T模式
        BRT = -(FOSC/32/BAUD);      //设置独立波特率发生器的重载初值

    TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
   // ES    = 1;                  //打开串口中断
}                           
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{

InitUART();

ES    = 1;                  //打开串口中断
receCount=0;
s485=0;
while (1)                       
{
        if(rtime<350){
                rtime++;
        }
        if(rtime==300){
                MODBUS();
                receCount=0;               
        }

               
}
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/

void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
      TI = 0;
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(void)
{        
        int i,t;
        s485=1;
        //for(t=0;t<100;t++);
          for(i=0;i<sendCount;i++){                                 
                SendByte(sendBuf);        
                sendPosi++;
                }
        //b485Send=R;
        s485=0;
        sendCount=0;
        sendPosi=0;
}
/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
        if(TI){                        //如果是发送标志位,清零
        TI=0;
        }
        if(RI){                        //判断是接收中断产生
                  RI=0;                      //标志位清零
                receBuf[receCount]=SBUF;
                receCount++;
                receCount&=0x0F;        
                //rtime=0;
                if(receCount>7){
                         //命令接收完毕
                //        receOK=1;
                //        receCount=0;
                        rtime=0;
                }
          }        

}

void MODBUS(void){
        uint16 crcR,crcL,crcSend;

        crcL=crc16(receBuf,receCount-2);
    crcR=(receBuf[receCount-2]<<8)  |  receBuf[receCount-1];
        
        if(receBuf[0]!=addr || crcR!=crcL){
                //UartClearBuffer();
                //return;
        }        
        sendBuf[0]=addr;
        sendBuf[1]=receBuf[1];
        switch(receBuf[1]){
                case ReadReg:{
                        sendCount=7;
                        switch(receBuf[3]){
                                case 0:{
                                        sendBuf[2]=0x02;
                                        sendBuf[3]=Reg0>>8;
                                        sendBuf[4]=Reg0&0xFF;
                                }break;
                                case 1:{
                                        sendBuf[2]=0x02;
                                        sendBuf[3]=Reg1>>8;
                                        sendBuf[4]=Reg1&0xFF;                                       
                                }break;
                                case 2:{
                                       
                                }break;
                        }
                }break;
                case WriteReg:{
                        sendBuf[2]=receBuf[2];
                        sendBuf[3]=receBuf[3];
                        sendBuf[4]=receBuf[4];
                        sendBuf[5]=receBuf[5];
                        sendCount=8;
                        switch(receBuf[3]){
                                case 0:{
                                        Reg0=receBuf[4]<<8 | receBuf[5];
                                }break;
                                case 1:{
                                        Reg1=receBuf[4]<<8 | receBuf[5];
                                }break;
                                case 2:{
                                       
                                }break;
                }break;
                default:{}
                }break;
        }
        
        crcSend = crc16(sendBuf,sendCount-2);
        sendBuf[sendCount-2]=crcSend>>8;
        sendBuf[sendCount-1]=crcSend;
        SendStr();
}

crc校验在头文件里面,
这是窜口调试,无论调试那个,都是正常的,CRC和数据都正确

000112-Rx:01 06 00 01 00 37 99 DC
000113-Tx:01 06 00 01 00 37 99 DC
000114-Rx:01 03 00 01 00 01 D5 CA
000115-Tx:01 03 02 00 37 F9 92
000116-Rx:01 03 00 01 00 01 D5 CA
000117-Tx:01 03 02 00 37 F9 92


000140-Rx:01 10 00 00 00 01 02 00 37 E7 86
000141-Tx:01 10 00 00 00 01 01 C9
000142-Rx:01 03 00 00 00 01 84 0A
000143-Tx:01 03 02 00 37 F9 92


000150-Rx:01 03 00 00 00 01 84 0A
000151-Tx:01 03 02 00 00 B8 44

000152-Rx:01 06 00 00 00 37 C8 1C
000153-Tx:01 06 00 00 00 37 C8 1C

000154-Rx:01 03 00 00 00 01 84 0A
000155-Tx:01 03 02 00 37 F9 92
很正常的,在计算机上用MODBUS调试软件两个都正常工作
触摸屏已设延迟10ms
MTP1.zip (13.45 KB, 下载次数: 652)
发表于 2012-11-19 13:03:12 | 显示全部楼层
注意通讯线连接方式,TK6070 RS232 管脚定义:6发送,9接收,5地。
您需要登录后才可以发帖 登录 | 注册

本版积分规则

回复帖子

Archiver|小黑屋|威纶通官网 ( 粤ICP备06054553号 )

GMT+8, 2025-8-19 12:45

Powered by Discuz! X3.4

© 2001-2023 Comsenz Inc.

快速回复 返回顶部 返回列表