4027|12

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

PLC与51单片机之间串行通信的问题(急求救...) [复制链接]

我用的PLC是OMRON的CPM2A。51单片机发,通过按键控制单片机串口发送的数据,使用的是外部中断INT1。当与p27口相连的按键按下时,单片机通过串口向PLC发送串“@00WD0000002859*
”,最后是一个回车符。因为有回车符,我不知道程序到底怎么编,我编的是发送他们的ASCII码,不知道行不行。
    下面是我编的C程序,希望高手帮我改下,虽然编译通过了,可硬件连上之后没什么反映,肯定是程序还有问题!帮帮忙...
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define MAXLEN 64    //缓冲区最大长度
uchar buf[MAXLEN];
sbit p27 = P2^7; sbit p26 = P2^6; sbit p25 = P2^5;
unsigned char in1,in2,in3;

//************************扫描按键**********************//
void intsvr1(void) interrupt 2 using 1
{

        in1=p27;
        in2=p26;
        in3=p25;
        if(in1==0)       
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 32 38 35 39 2a 0d");

           if(in2==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 33 38 35 38 2a 0d");

        if(in3==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 34 38 35 3f 2a 0d");
}


void init()
{
        TMOD=0x20;                          //定时器1工作于方式2
        TH1 = 250;                          // 设置初值
            TL1 = 250;
            PCON = 0x80;                        // SMOD = 1
            SCON = 0x50;                        //工作方式1(启动位1位,数据位8位,停止位1位),波特率9600bps,允许接收
        IT1=0;        //设置INT1为低电平触发
            TR1 = 1;                            //定时器1开始工作
        EA=1;                               //打开所有中断
        EX1=1;
}
//************************串口通信程序****************************************//

/* 发送数据函数 */
void senddata(uchar *buf)
{
        uint i;
        uint len;                                        // 保存数据长度

        len = strlen(buf);                        // 计算要发送数据的长度

        for (i=0;i         {
                SBUF = *buf;
                buf++;
        }
}       
//*************************主函数***********************//
void  main()
{
      init();
      while(1)
      {
         senddata(buf);
      }  
}

最新回复

R和T你是不是接反了? 这也有可能  详情 回复 发表于 2007-6-18 02:35
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
问题挺多的

1. 什么叫没有回车符? 0x0D不就是回车吗?
2. 发送是ASCII码?其实在缓冲区里面都是二进制数据,看你怎么 组织了。

以上两点,仅供参考!
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关于调试哈...

咱们一定要找到表现,没有表现依据那很可怕的...

其实就是去发现问题
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
我感觉是不是应该先接个其他终端看看是否能收到你所发的"@00WD0000002859*"

初雪者的愚见!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
回车符就是16进制数的0D;
使用串口调试工具给plc发数据测试协议;
同样使用串口调试工具测试51发出的协议是不是正确;

 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
看来LZ不大喜欢操作16进制数
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
下個AccessPort來測試一下看看哪裡出錯
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

8
 
我改了!再发次试试!
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define MAXLEN 64    //缓冲区最大长度
uchar buf[MAXLEN];
sbit p27 = P2^7; sbit p26 = P2^6; sbit p25 = P2^5;
unsigned char in1,in2,in3;

//************************扫描按键**********************//
void intsvr1(void) interrupt 2 using 1
{

in1=p27;
in2=p26;
in3=p25;
if(in1==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 32 38 35 39 2a 0d");

   if(in2==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 33 38 35 38 2a 0d");

if(in3==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 34 38 35 3f 2a 0d");
}


void init()
{
        TMOD=0x20;                          //定时器1工作于方式2
        TH1 = 250;                          // 设置初值
    TL1 = 250;
    PCON = 0x80;                        // SMOD = 1
    SCON = 0x50;                        //工作方式1(启动位1位,数据位8位,停止位1位),波特率9600bps,允许接收
        IT1=0;        //设置INT1为低电平触发
    TR1 = 1;                            //定时器1开始工作
        EA=1;                               //打开所有中断
        EX1=1;
}
//************************串口通信程序****************************************//

/* 发送数据函数 */
void senddata(uchar *buf)
{
uint i;
uint len;// 保存数据长度

len = strlen(buf);// 计算要发送数据的长度

for (i=0;i {
es=0;
SBUF = *buf;
while(TI==0);
TI=0;
es=1;
buf++;
}
}
//*************************主函数***********************//
void  main()
{
      init();
      while(1)
      {
         
         senddata(buf);
         
      }  
}
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

9
 
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define MAXLEN 64    //缓冲区最大长度
uchar buf[MAXLEN];
sbit p27 = P2^7; sbit p26 = P2^6; sbit p25 = P2^5;
unsigned char in1,in2,in3;

//************************扫描按键**********************//
void intsvr1(void) interrupt 2 using 1
{

in1=p27;
in2=p26;
in3=p25;
if(in1==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 32 38 35 39 2a 0d");

   if(in2==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 33 38 35 38 2a 0d");

if(in3==0)
     strcpy(buf,"40 30 30 57 44 30 30 30 30 30 30 34 38 35 3f 2a 0d");
}


void init()
{
        TMOD=0x20;                          //定时器1工作于方式2
        TH1 = 250;                          // 设置初值
    TL1 = 250;
    PCON = 0x80;                        // SMOD = 1
    SCON = 0x50;                        //工作方式1(启动位1位,数据位8位,停止位1位),波特率9600bps,允许接收
        IT1=0;        //设置INT1为低电平触发
    TR1 = 1;                            //定时器1开始工作
        EA=1;                               //打开所有中断
        EX1=1;
}
//************************串口通信程序****************************************//

/* 发送数据函数 */
void senddata(uchar *buf)
{
uint i;
uint len;// 保存数据长度

len = strlen(buf);// 计算要发送数据的长度
TI=0;
for (i=0;i {
ES=0;
SBUF = *buf;
while(TI==0);
TI=0;
ES=1;
buf++;
}
}
//*************************主函数***********************//
void  main()
{
      init();
      while(1)
      {
         senddata(buf);
      }  
}
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
怎么没有人回了啊?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

11
 
不好意思,这些天有事,才刚看贴子!
谢谢楼上抽时间给我看,可是硬件还是没有通过。
之前我用VC++编过计算机和CPM2A的串口通信。那是基于对话框的,已经通过了,所以CPM2A的设置肯定没问题。现在就是想让单片机取代计算机,可是C语言水平有限,希望高手们在帮帮忙!
把单片机板子和CPM2A连在一起时,按按键,通信的指示灯连闪都不闪,更别提让我想要的功能实现了。连接线也肯定没问题。现在就是这个C程序的问题。
诶呦,,高手啊,帮帮忙吧!!!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
为什么PCOND=0x80,你的计数器初值有什么依据?既然是9600的波特率,工作在方式1就把PCON改成0x00,计数器初值改为TH1=TL1=0xfd试试,串口通信不成功大部分都是初始化没设置好造成的,你先单独把发送程序调出来再加到主程序中去。
贴个单独发送的程序给你参考一下,这个程序100%准确,我最近调试串口通信就是用的这个程序,程序运行时单片机不停地向外发送数据,发送什么你自己看看再自己定义吧:
//单独的发送程序,不停发送"03"
#include
unsigned char Dat = 0x03;


main()
{                 
        TMOD=0x20;       
        TH1=0xFD;         
         TL1=0xFD;          
        PCON=0x00;          
        TR1=1;               
        SCON=0x50;
        while(1)
        {                  
                    SBUF=Dat;
                while(TI==0);
                TI=0;
                TR1=1;       
                       
    }
}
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 
R和T你是不是接反了?
这也有可能
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表