小i,想裸奔用open,ioctrl,写通信代码。给个思路。现在有

[复制链接]
 楼主| xlsbz 发表于 2014-10-3 16:47 来自手机 | 显示全部楼层 |阅读模式
现在有几个485,一个
can,
关键是我看不出open有什么好的?难道只是为了统一么?
mohanwei 发表于 2014-10-3 17:21 | 显示全部楼层
你尝试在IAR/KEIL工程里放一个open()进去,编译,提示缺少open()声明……现在你一点点从linux源码树里拷贝代码过来,缺啥拷贝啥,再编译,再拷贝……慢慢的错误和警告就飙升到几百个以上,慢慢你就疯了……:lol
 楼主| xlsbz 发表于 2014-10-3 18:48 来自手机 | 显示全部楼层
mohanwei 发表于 2014-10-3 17:21
你尝试在IAR/KEIL工程里放一个open()进去,编译,提示缺少open()声明……现在你一点点从linux源码树里拷贝 ...

当然自己写open啦。
 楼主| xlsbz 发表于 2014-10-3 18:49 来自手机 | 显示全部楼层
或者弄个vxworks的。其实不难。关键是我感觉这么弄好处在哪里
mohanwei 发表于 2014-10-3 19:14 | 显示全部楼层
原来你只是想仿一个外皮……这个比较简单,把原来的使能外设时钟、设置IO方向、波特率……全按顺序放到open()里就好了
就是可读性没有原来的好
 楼主| xlsbz 发表于 2014-10-3 20:59 来自手机 | 显示全部楼层
mohanwei 发表于 2014-10-3 19:14
原来你只是想仿一个外皮……这个比较简单,把原来的使能外设时钟、设置IO方向、波特率……全按顺序放到open ...

想仿造本质
dong_abc 发表于 2014-10-4 02:54 | 显示全部楼层
本帖最后由 dong_abc 于 2014-10-4 02:58 编辑

有人已经做过类似的事情,看看这个帖子,里面有些干货,30楼以后
http://bbs.21ic.com/icview-651732-1-1.html

底层的东西,怎么折腾都是些寄存器,占整个项目极少的一部分,没必要折腾了。
 楼主| xlsbz 发表于 2014-10-4 07:10 | 显示全部楼层
dong_abc 发表于 2014-10-4 02:54
有人已经做过类似的事情,看看这个帖子,里面有些干货,30楼以后
http://bbs.21ic.com/icview-651732-1-1.h ...

不弄底层。还是用ST的库。
倒腾寄存器是高手或初学者干的事情。咱们凡夫俗子不弄
icecut 发表于 2014-10-4 09:50 | 显示全部楼层
open 还是为了统一接口。当然。还是理解os为什么用open再去玩。否则自己也不知道该写到什么程度。
其实open只是告诉管理者我要用这个东西。管理者就会去记录。别人open的时候确认能不能共享。还是一个多任务的管理问题。你若不是多任务,多人开发,那就只剩下美观了。
记得要@icecut 我才能尽快看见
 楼主| xlsbz 发表于 2014-10-5 17:56 | 显示全部楼层
本帖最后由 xlsbz 于 2014-10-5 18:02 编辑
icecut 发表于 2014-10-4 09:50
open 还是为了统一接口。当然。还是理解os为什么用open再去玩。否则自己也不知道该写到什么程度。
其实open ...

大侠,照葫芦画瓢搞了一个
@icecut
  1. void myusart1_init(void)
  2. {
  3.   fd_usart1 = open("/dev/usart1");
  4.   ioctl(fd_usart1, CMD_BAUDRATE, 115200);
  5.   ioctl(fd_usart1, CMD_HW_OPTS_SET, CS8 | STB1 | PARNO);
  6.   connect(fd_usart1);

  7. }
  1. void myusart2_init(void)
  2. {
  3.   fd_usart2 = open("/dev/usart2");
  4.   ioctl(fd_usart2, CMD_BAUDRATE, 38400);
  5.   ioctl(fd_usart2, CMD_HW_OPTS_SET, CS8 | STB1 | PARNO);
  6.   connect(fd_usart2);
  7. }

  1.   fd_can1 = open("/dev/can1");
  2.   ioctl(fd_can1, CMD_BAUDRATE, 500);
  3.   ioctl(fd_can1, CMD_HW_OPTS_SET, ATOBFF | ATOSND);
  4.   ioctl(fd_can1, CMD_HW_CAN_FILTER, 0);
  5.   connect(fd_can1);
  6.   return (0);



感觉作用一个是统一接口,另外,检查比如初始化串口是否初始化已经初始化过了。在write的时候,要先检查是否已经初始化了。另外还有你说的利于多人开发。

另外 还有问题问小i,在51判断接收到的帧是否是新的一帧
可以中断搞个标志位,或者搞个计数器,然后在while大循环里判断标志位。

那么linux里面是如何判断来了新的一帧了?
icecut 发表于 2014-10-5 19:36 | 显示全部楼层
xlsbz 发表于 2014-10-5 17:56
大侠,照葫芦画瓢搞了一个
@icecut

我一般是数据流解析,软件来分帧。不去依赖硬件来完成这件事。
当然,485之类规定是硬件超时之类的还要按照规范用硬件来实现。

你的代码可以。标准接口也不用太严格。毕竟太严格会浪费太多开发时间。你自己去权衡
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

190

主题

1614

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部