打印
[CAN-bus/DeviceNet]

发送数据丢失

[复制链接]
2050|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dateakila|  楼主 | 2011-8-19 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接入CAN 网络(控制器与我的开发板),如果控制器发送的数据的间隔时间超过100MS,则开发板可以完全的接收数据,如果控制器发送的数据小于50ms,则开发板开始都是数据,控制器发送数据的间隔越短,则丢失的数据越多。但是发送数据,控制器可以完全的接收数据。。。
还望高手指教。。。谢谢!!

相关帖子

沙发
airwill| | 2011-8-19 12:28 | 只看该作者
你的接收软件的问题吧, 好好看看.
很有可能你的接收中断是耗时太大, 来不及处理那些数据.

另外你的数据包是不是太大, 波特率是不是太低? 计算或者用示波器看看一次数据传输要多少时间?

使用特权

评论回复
板凳
dateakila|  楼主 | 2011-8-19 13:07 | 只看该作者
#include "mbed.h"
#include "CAN.h"

LocalFileSystem local("local");

CAN can1(p30, p29);

int main() {

    unsigned short a,b,c,d,e,f,g,h,i,j,k,l;
   
    FILE *fp;

    CANMessage msg(0x00);

    can1.frequency(80000);
//    LPC_CAN1->BTR = 0x52001C;

    /*********Program Starts Here***************/
   
    while(1) {   
        if(can1.read(msg)) {
     /*********data.read(in1)**************************************************/
                a = msg.data[0]<<8;
                b = msg.data[1];
                c = a + b;
     /*********data.read(in2)**************************************************/
                d = msg.data[2]<<8;
                e = msg.data[3];
                f = d + e;
     /*********data.read(in3)**************************************************/
                g = msg.data[4]<<8;
                h = msg.data[5];
                i = g + h;
     /*********data.read(in4)**************************************************/
                j = msg.data[6]<<8;
                k = msg.data[7];
                l = j + k;
     /**********write file*****************************************************/           
                fp = fopen("/local/CAN_multiread.csv", "a");
                if (fp!=NULL){
                        fprintf( fp, "%f,%f,%f,%f\n", (float)c*3.3/0xFFFF,(float)f*3.3/0xFFFF,(float)i*3.3/0xFFFF,(float)l*3.3/0xFFFF);
                        fclose( fp );
                }
         }
    }
}

这是我写的接受的程序。。。我是学机械工的。。对编程不太懂。。还望指教/。。

使用特权

评论回复
地板
airwill| | 2011-8-31 12:15 | 只看该作者
看明白了.
问题出在 这里:
                fp = fopen("/local/CAN_multiread.csv", "a");
                if (fp!=NULL){
                        fprintf( fp, "%f,%f,%f,%f\n", (float)c*3.3/0xFFFF,(float)f*3.3/0xFFFF,(float)i*3.3/0xFFFF,(float)l*3.3/0xFFFF);
                        fclose( fp );

fopen 和 fprintf 这两个函数太费时间, 等这两个函数执行完, 已经有好多个数据包传输完成了, 所以数据丢失.

不妨这样修改你的程序.
把 abcdefghijkl, 这些变量的处理放在 can 的中断函数中; 处理结果cfil 放在软件 FIFO 缓冲中, 交给 main() 的主循环去处理.
fopen 和 fclose 不要每次有数据时都调用, 而是刚开始和最终结束的时候调用一次就可以了.
fprintf 也很费时间. 既然格式是一致的, 不如用 itoa 这样比较快的函数来处理.

使用特权

评论回复
5
ejack| | 2011-9-1 07:36 | 只看该作者
fprintf这种二手函数也就做做实验还行。真刀真枪时还得自己进行文件IO。

使用特权

评论回复
6
dateakila|  楼主 | 2011-9-7 15:56 | 只看该作者
数据都收到了。。谢谢。。帮了大忙了:)

使用特权

评论回复
7
dateakila|  楼主 | 2011-9-7 16:34 | 只看该作者
4# airwill
具体怎么改比较好。。还望指教。。。。谢谢

使用特权

评论回复
8
dateakila|  楼主 | 2011-9-7 17:37 | 只看该作者
4# airwill
itoa不是很懂。。请指教。谢谢

使用特权

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

本版积分规则

0

主题

6

帖子

1

粉丝