打印

请教关于STM32 CAN与USART同时通讯的问题

[复制链接]
3534|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hahaygy|  楼主 | 2013-3-14 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟在用MCU为 STM32F103ZET6 的一块板子学习当中,现在USART和CAN已经分别调通。
现在想请教一下各位高手:
我手边有一台可以通过232串口与PC通讯的机器,是通过PC上一个软件发送指令来控制通讯,但是限于232传输距离不够,我想先用我自己板子上的串口232与机器通讯,然后通过CAN与PC通讯,借此延长传输距离,这样一来,PC跟机器的功能不变,只是我的板子起到了一个中转的作用,日后想在板子上加上显示等用来显示有用的数据。
精通STM32的各位能否给我一个思路,说说这个中转的过程,具体都能用到STM32的哪些功能,详细说一下,谢谢大家!!!
沙发
jlass| | 2013-3-14 16:17 | 只看该作者
就是把232的数据收下来然后用CAN发出去啊

中间最好加个缓冲。

使用特权

评论回复
板凳
hahaygy|  楼主 | 2013-3-14 16:32 | 只看该作者
感谢jlass的回答,那我想再请问一下,中间的这个缓冲是指什嘛?我只懂得定义一个数组, 然后把收到的数放进去,然后再发出去?还是跟内部SRAM或者在FLASH里定义一段地址存放什么的?还是用DMA什么的?小弟还不是很懂,请再说的详细点我再看看!

使用特权

评论回复
地板
hahaygy|  楼主 | 2013-3-14 16:33 | 只看该作者
jlass 发表于 2013-3-14 16:17
就是把232的数据收下来然后用CAN发出去啊

中间最好加个缓冲。

感谢jlass的回答,那我想再请问一下,中间的这个缓冲是指什嘛?我只懂得定义一个数组, 然后把收到的数放进去,然后再发出去?还是跟内部SRAM或者在FLASH里定义一段地址存放什么的?还是用DMA什么的?小弟还不是很懂,请再说的详细点我再看看!

使用特权

评论回复
5
jlass| | 2013-3-14 17:15 | 只看该作者
本帖最后由 jlass 于 2013-3-14 17:16 编辑
hahaygy 发表于 2013-3-14 16:33
感谢jlass的回答,那我想再请问一下,中间的这个缓冲是指什嘛?我只懂得定义一个数组, 然后把收到的数放 ...

把收到得232数据缓冲一下再传,可以让传输比较连续,不会时有时无的。
就是定义一个数组, 然后把收到的数放进去,然后再发出去

英文叫jitter buffer,不知道你传的是什么数据,对语音等连续数据比较有意义,对于异步数据其实毫无意义。

使用特权

评论回复
6
cjhk| | 2013-3-14 20:55 | 只看该作者
其实就是加一级缓冲   降低传输速率  从而降低传输出错率  不知道我这样理解对不

使用特权

评论回复
7
cjhk| | 2013-3-14 20:55 | 只看该作者
ST的芯片不是很熟悉  还希望版主多多指点   谢谢了  呵呵

使用特权

评论回复
8
jiaxinhui| | 2013-3-14 21:43 | 只看该作者
既然你已经把CAM和232分别调通了,那就不难了。协调好各自的收发寄存器,很容易实现。

使用特权

评论回复
9
hahaygy|  楼主 | 2013-3-15 18:58 | 只看该作者
jlass 发表于 2013-3-14 17:15
把收到得232数据缓冲一下再传,可以让传输比较连续,不会时有时无的。
就是定义一个数组, 然后把收到的数 ...

每次发送的都是一串8位的十六进制数,1到9个不等!非常感谢,看来还是可以实现的!我试试看,如果有不会的再来请教!

使用特权

评论回复
10
hahaygy|  楼主 | 2013-3-15 19:00 | 只看该作者
cjhk 发表于 2013-3-14 20:55
其实就是加一级缓冲   降低传输速率  从而降低传输出错率  不知道我这样理解对不 ...

看了5楼和您的回答大概明白该怎么办了,非常感谢!

使用特权

评论回复
11
hahaygy|  楼主 | 2013-3-15 19:01 | 只看该作者
jiaxinhui 发表于 2013-3-14 21:43
既然你已经把CAM和232分别调通了,那就不难了。协调好各自的收发寄存器,很容易实现。 ...

请问这个是不是CAN和USART的收发都要在中断中完成呢?

使用特权

评论回复
12
jiaxinhui| | 2013-3-15 20:40 | 只看该作者
那要看实际情况了,用中断的话,响应快。CPU占用率低。

使用特权

评论回复
13
hahaygy|  楼主 | 2013-3-16 10:00 | 只看该作者
jiaxinhui 发表于 2013-3-15 20:40
那要看实际情况了,用中断的话,响应快。CPU占用率低。

好的~谢谢~~~

使用特权

评论回复
14
杨爱林林| | 2013-3-16 10:57 | 只看该作者
这个还是比较容易实现的
你的usart和can都调试好了
那么 你只要把之前pc控制机器的指令发到板子上,而且在pc和板子直接调can还是很方便的
接收建议你用中断  
再说usart方面  你也可以把板子连到pc上返回收到pc通过can发送的数据
直到返回的数据 和最初  pc直接控制机器的指令一样  就好了啊

使用特权

评论回复
15
hahaygy|  楼主 | 2013-3-18 09:15 | 只看该作者
杨爱林林 发表于 2013-3-16 10:57
这个还是比较容易实现的
你的usart和can都调试好了
那么 你只要把之前pc控制机器的指令发到板子上,而且 ...

    非常感谢!结合了一下您所说的,PC------板子------机器, PC 板子之间用CAN,板子 机器之间用USART,PC通过CAN发来的数据,以原来PC---机器直接通讯时的格式,在USART这边发送出去。    那么我想再请问一下,我还想对这些数据进行一下冗余的处理,所以需要暂时在STM32上存放一下,中间这个缓冲应该怎么加一下呢?    尤其是CAN这边接收了从PC传来的数据,是只存放在  RxMessage.Data[0]  , RxMessage.Data[1] , RxMessage.Data[2] ... ... 这些里面吗?如果超过了RxMessage.Data[7]的话,是不是又从 RxMessage.Data[0] 开始存放就把之前的覆盖了呢?这个在Debug的时候没法在Watch中看到,所以请教一下。。。

使用特权

评论回复
16
杨爱林林| | 2013-3-18 10:59 | 只看该作者
hahaygy 发表于 2013-3-18 09:15
非常感谢!结合了一下您所说的,PC------板子------机器, PC 板子之间用CAN,板子 机器之间用USART ...

对的  首先申明,我can学得不好
我在调试的时候 不管是pc和板子,还是板子和板子间的can通讯,都是8字节数据的
CanRxMsg.DLC    This parameter can be a value between 0 to 8
当然 你在接收的时候 要判断标识符(也称帧ID)  stm32 有自带的过滤器,设置好后,自动判断该帧是否是你需要的帧  如果不设置 觉得麻烦  可以不用设置(把过滤器直接设置成0x00即可)  然后在程序里面判断id
自己定义个buf  把RxMessage.Data保存下来就行啦

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hahaygy + 1 赞一个!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝