打印
[ZLG-ARM]

LPC2214做485变频器通讯时遇到难题

[复制链接]
2254|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wawayuxc|  楼主 | 2008-3-1 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人正在用ARM通过max485对台达变频器通讯,
大家看看程序有没有问题
/****************************************************************************
* 文件名:SENDSTR.C
* 功能:向串口发送数据。

****************************************************************************/
#include  "config.h"

#define  INT8U   unsigned char   
#define  UART_BPS    19200            /* 定义通讯波特率 */
INT8U  OUT_BUF2[17]={0x3a, 0x30,0x31, 0x30,0x36, 0x32,0x30,0x30,0x31, 0x30,0x30,0x31,0x32, 0x43,0x37, 0x0D,0x0A};//通讯协议
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly        延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}


//#define  UART_BPS    19200            /* 定义通讯波特率 */
/****************************************************************************
* 名称:UART0_Ini()

****************************************************************************/
void  UART1_Ini(void)
{  uint16 Fdiv;

   U1LCR = 0x87;                    // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / UART_BPS;  // 设置波特率
   U1DLM = Fdiv / 256;                            
   U1DLL = Fdiv % 256;                        
   U1LCR = 0x07;
}
                

/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data        要发送的数据
* 出口参数:无
****************************************************************************/
void  UART1_SendByte(uint8 data)
{  
    U1THR = data;        // 发送数据
       while( (U1LSR&0x40)==0 );        // 等待数据发送完毕
}


/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送一字符串
****************************************************************************/
void  UART1_SendStr()
{  
     INT8U  i;
    
     for(i=0;i<17;i++)
     {
          IO0SET|=0x10;
          UART1_SendByte(OUT_BUF2);
          IO0CLR|=0x10;
     }
    
}



/****************************************************************************
* 名称:main()
* 功能:
****************************************************************************/
int  main(void)
{  
    PINSEL0 = 0x00050000;// 设置I/O连接到P0.4(收发控制IO)
       IO0DIR=0x10;                            
         UART1_Ini();

       while(1)    
       { 
          UART1_SendStr();
          DelayNS(10);
       }
       return(0);
}


不知道发送程序有没有问题,调试到
          U1THR = data;        // 发送数据
       while( (U1LSR&0x40)==0 );        // 等待数据发送完毕

变频器就显示通讯错误。

相关帖子

沙发
dld2| | 2008-3-1 13:44 | 只看该作者

每发送一个字节都要设置收发控制吗

不对吧。

应该先允许发送;
然后延时一会儿。
然后发送17个字节。
然后再延时一会儿。
然后再允许接收。

使用特权

评论回复
板凳
wawayuxc|  楼主 | 2008-3-1 14:31 | 只看该作者

回2楼


你说的那种我也试过了,也不行。

使用特权

评论回复
地板
toluoxin| | 2008-3-1 20:31 | 只看该作者

UART

观察串口输出信号,与确定的信号对比一下.

使用特权

评论回复
5
hms35| | 2008-3-2 10:22 | 只看该作者

我的几个疑问

1.你初始化时为什么选择2个停止位呢?U1LCR的第二位为1.

2.你控制引脚P0.14在初始化之后应赋个值啊。确定485的发送还是接收。

3.变频器报错有很多原因,您说:“在调试到U1THR = data;while( (U1LSR&0x40)==0 ); 变频器就显示通讯错误”。
这个我就很怀疑,变频器很有可能只是接收到你的第一个字节后,一段时间后没有收到下一个字节(你在调试),就报错了。
所以你只能整个报文协议发完了,才能确定报错是否有意义。

使用特权

评论回复
6
wawayuxc|  楼主 | 2008-3-3 09:47 | 只看该作者

回复5楼

1.变频器字节协议是需要2个stop位,或者是1位奇校验加停止位或偶校验加停止位三种模式
2.硬件连接上初始就对p0.4上拉高电平的
3.这个我再试试。
4谢谢解答

使用特权

评论回复
7
hms35| | 2008-3-3 11:26 | 只看该作者

IOSET

2.硬件上拉不等于管脚就一定是高电平,要IOSET才能确保。

使用特权

评论回复
8
wawayuxc|  楼主 | 2008-3-3 15:47 | 只看该作者

我用示波器侧过

示波器测试cpu发送口发现波形不稳定,有毛刺而且抖动不知道是什么原因啊

使用特权

评论回复
9
wawayuxc|  楼主 | 2008-3-4 16:26 | 只看该作者

发现波特率不正确,但是也不知道哪里不对

后来示波器测试一下是波特率不正确,不知道怎么回事,都是按照书上公式设置的啊,怎么会错啊百思不得其解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

72

帖子

1

粉丝