返回该小组首页 回复主题
alex_zhou

alex_zhou

小组等级:     E币:169  (E币换礼)

#1楼主:参考PIAE 例程 CAN RS232 同时使用时的问题

文章发表于:2008-06-29 12:12

  太感激彩云及PIAE了,本坛提供的学习板及程序例子把我带入门了,因有C的基础,所以很容易入门了,    现在本人急切需求想做一个实用一点的系统 用于生产线上的零 件条码收集,所收集后的数据通过RS232口提交给PC ,留作MRP系统的基础数据,

     感谢PIAE提供的例程非常实用, 我现时已实现了   条码阅读机--->RS232 -->单片机 ---CAN(节点一)-------------------------> CAN(节点二) ---->单片机 232 --->电脑

    已初步通过,  PC端的程序用DELPHI 编写.

但在调试节点一的程序时发现一个问题,就是 can   的发送函数一用上时(Txd_deal(void) )  会对232的发送有影响  ,会中断RS232的的信号收集 ,即8位的条码,只会发送4位的条码 .

           PIAE 及各位DX能帮忙解决问题吗?不胜感激!

 

alex_zhou

   小组等级:    E币:169  (E币换礼)

#2

文章发表于:2008-06-29 00:21

void Txd_deal(void)
{//发送处理函数,主要是准备数据,并且调用发送函数
    if( TXD_flag == 1 )
    {
        _nop_();
        TXD_flag = 0;
        TX_buffer[5]  = Txd_data;//
        CAN_TXD();
        _nop_();
        _nop_();
     }
}

void main(void)
{
//CPU初始化
    SJA_RST = 1;//CAN总线复位管脚
    SJA_CS = 0;//CAN总线片选有效
    EX1 = 1;
    IT1 = 0;//CAN总线接收中断
    IT0 = 1;//外部中断0负边沿触发
    EX0 = 1;//打开外部中断0
    EA = 1; //打开总中断
    SJA_CS = 1;//CAN总线片选无效,保证数据线上的变化不会影响SJA1000
//CPU初始化

    CAN_init(  );


    _nop_();
    _nop_();

    CPU_init();
    _nop_();
    while(1)
    {
        NOPS;
//////////////////////// 接收处理程序/////////////////////////////////
        if( RXD_flag )
        {
            EA = 0;//关闭CPU中断
            LED_RED = !LED_RED;//指示灯状态变化
            RXD_flag = 0;//清除标志

             //下面的是本人更改的部份  只是把RS232接收的数据传给 CAN 发送出去 

            TXD_flag =1 ;

            Rxd_data =RX_data ;

            Txd_deal();//发送处理程序


            EA = 1;
        }
///////////////////////数码管显示程序/////////////////////////////////
        led_seg7(1,Show_TX_Data);
        led_seg7(3,Show_RX_Data);
///////////////////////数码管显示程序/////////////////////////////////
    }//while 结束
}//main结束

alex_zhou

   小组等级:    E币:169  (E币换礼)

#3

文章发表于:2008-06-29 00:30

并在RS232 接收函数上加上计数变量 Count_232

void RS232_RXD( void ) interrupt 4   using 1
{//接收数据函数,在中断服务程序中调用
    EA = 0;//关闭所有中断
    ES = 0;//关闭串口
    if(RI==1)
    {
        RI = 0;
        RX_data = SBUF;
        RXD_flag = 1;//置接收到数据标志

        Count_232++;    
    }
    _nop_();
    ES = 1;//打开串口

 

并在Main  函数加上显示 RS232 接收数据的长度

  led_seg7(3,Count_232);

 

很奇怪的是 原先从RS232 从传递的数据变短了,原先8位的字串只接收到4位,

把 Main  函数里的   Txd_deal();//发送处理程序    删除后 就正常了。

 

各位DX ,能告之解决办法吗 ,不胜感激!

 

alex_zhou

   小组等级:    E币:169  (E币换礼)

#4

文章发表于:2008-06-30 10:39

    PIAE  兄,能告之我原因吗 ,最后找到 CAN发送函数中去,把 CMR = 0x01删除后RS232的接收就正常了,但CAN信号就没有发送出去 ,因为CMR是发送标志,不能去除的 , 因对C51 及CAN 的基础知识还不熟悉 ,是否CAN总线的初始设定问题,把接收或发送的长度给限制了,求各位指点......

 

急死了!

 

void CAN_TXD( void )
{
    uchar data Judge;
    uchar data TX_buffer[ N_can ] ;

..................................

.................................

    //  把如下语句删除后 ,RS232的接收变正常了
    CMR = 0x01;


   EA  = 1;


}

piae

   小组等级:    E币:896  (E币换礼)

#5

文章发表于:2008-06-30 12:22

 最近比较忙,没有仔细看你的程序,但是从你的描述来看,can的中断是不是和串口的中断冲突呢?你安排一下中断的调用,看看能不能解决问题

alex_zhou

   小组等级:    E币:169  (E币换礼)

#6

文章发表于:2008-07-01 08:59

piae兄,谢谢你的回复, 程式是按你提供的例程,很少改动

RS232接收数据的中断设定是: 

void RS232_RXD( void ) interrupt 4   using 1

CAN接收数据的中设定是:

void CAN_RXD( void ) interrupt 2

  Rs232 的发送及CAN的发送没用到中断。

我看不到有冲突的地方,是否条码机的读数据方式与本程式的模式不配合:

    条码机是一次过把几个到十几个字符一同传送到单片机上,但单片机每从RS232口接收一个字符就引起中断 并 调用CAN再发送 ,但PIAE提供的例程是从按键每按一下就触发一次发送,但条码机从RS232口一次有一堆数据发送,不知这样用同样程式结构能否处理 ,不知道这是不是产生问题的原因。

 

piae

   小组等级:    E币:896  (E币换礼)

#7

文章发表于:2008-07-01 14:58

CAN总线一包数据可以发送8个字节,你可以收到8个字节的串口数据启动一次CAN发送程序!

alex_zhou

   小组等级:    E币:169  (E币换礼)

#8

文章发表于:2008-07-02 16:53

   谢谢PIAE的指点 ,程式改成 "CAN总线一包数据发送8个字节的方式" 改程序 ,问题就解决了 , 原因是当RS232 读数据较多时 ,若有其它程式执行占太多时间的话 ,会影响RS232口数据的读取。

jizzll

   小组等级:    E币:1374  (E币换礼)

#9

文章发表于:2008-09-11 19:52

LZ,能提供点资料么

Spirit74

   小组等级:    E币:90  (E币换礼)

#10

文章发表于:2008-09-18 22:03

我以为,楼主在

//////////////////////// 接收处理程序/////////////////////////////////
        if( RXD_flag )
        {  ...}

里面关中断就意味着有丢数据的风险

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

浏览该小组的用户还看过...

设计资源与分销