打印

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

[复制链接]
1257|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2014-10-3 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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的。其实不难。关键是我感觉这么弄好处在哪里

使用特权

评论回复
5
mohanwei| | 2014-10-3 19:14 | 只看该作者
原来你只是想仿一个外皮……这个比较简单,把原来的使能外设时钟、设置IO方向、波特率……全按顺序放到open()里就好了
就是可读性没有原来的好

使用特权

评论回复
6
xlsbz|  楼主 | 2014-10-3 20:59 | 只看该作者
mohanwei 发表于 2014-10-3 19:14
原来你只是想仿一个外皮……这个比较简单,把原来的使能外设时钟、设置IO方向、波特率……全按顺序放到open ...

想仿造本质

使用特权

评论回复
7
dong_abc| | 2014-10-4 02:54 | 只看该作者
本帖最后由 dong_abc 于 2014-10-4 02:58 编辑

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

底层的东西,怎么折腾都是些寄存器,占整个项目极少的一部分,没必要折腾了。

使用特权

评论回复
8
xlsbz|  楼主 | 2014-10-4 07:10 | 只看该作者
dong_abc 发表于 2014-10-4 02:54
有人已经做过类似的事情,看看这个帖子,里面有些干货,30楼以后
https://bbs.21ic.com/icview-651732-1-1.h ...

不弄底层。还是用ST的库。
倒腾寄存器是高手或初学者干的事情。咱们凡夫俗子不弄

使用特权

评论回复
9
icecut| | 2014-10-4 09:50 | 只看该作者
open 还是为了统一接口。当然。还是理解os为什么用open再去玩。否则自己也不知道该写到什么程度。
其实open只是告诉管理者我要用这个东西。管理者就会去记录。别人open的时候确认能不能共享。还是一个多任务的管理问题。你若不是多任务,多人开发,那就只剩下美观了。
记得要@icecut 我才能尽快看见

使用特权

评论回复
10
xlsbz|  楼主 | 2014-10-5 17:56 | 只看该作者
本帖最后由 xlsbz 于 2014-10-5 18:02 编辑
icecut 发表于 2014-10-4 09:50
open 还是为了统一接口。当然。还是理解os为什么用open再去玩。否则自己也不知道该写到什么程度。
其实open ...

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

}
void myusart2_init(void)
{
  fd_usart2 = open("/dev/usart2");
  ioctl(fd_usart2, CMD_BAUDRATE, 38400);
  ioctl(fd_usart2, CMD_HW_OPTS_SET, CS8 | STB1 | PARNO);
  connect(fd_usart2);
}

  fd_can1 = open("/dev/can1");
  ioctl(fd_can1, CMD_BAUDRATE, 500);
  ioctl(fd_can1, CMD_HW_OPTS_SET, ATOBFF | ATOSND);
  ioctl(fd_can1, CMD_HW_CAN_FILTER, 0);
  connect(fd_can1);
  return (0);



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

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

那么linux里面是如何判断来了新的一帧了?

使用特权

评论回复
11
icecut| | 2014-10-5 19:36 | 只看该作者
xlsbz 发表于 2014-10-5 17:56
大侠,照葫芦画瓢搞了一个
@icecut

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

你的代码可以。标准接口也不用太严格。毕竟太严格会浪费太多开发时间。你自己去权衡

使用特权

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

本版积分规则

190

主题

1614

帖子

4

粉丝