社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 867|回复: 19

[讨论] 关于esp8266 for micropython平台下的UART0接口使用

[复制链接]

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-11-20 10:11:14 | 显示全部楼层 |阅读模式
        在esp8266下调试pm2.5模块时,由于UART0接口被repl占用,接线后直接死机。查看相关资料后,有一想法:UART0在用串口输出时才占用,如果不在repl模式下调试程序,UART0 是否可用???



回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-11-20 13:19:33 | 显示全部楼层
repl是什么?8266有两个串口的,你和PM2.5的是用哪个串口呢,我之前做的是UART0用作和PM2.5通信,UART1用作LOG没问题。

点评

UART1 只能发送不能接受,只能使用UART0,而0口被repl(串口调试模式)占用,请问你是怎么做的,能提供思路吗。  详情 回复 发表于 2017-11-20 13:28


回复

使用道具 举报

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-11-20 13:28:00 | 显示全部楼层
Jason.zhou 发表于 2017-11-20 13:19
repl是什么?8266有两个串口的,你和PM2.5的是用哪个串口呢,我之前做的是UART0用作和PM2.5通信,UART1用作 ...

UART1 只能发送不能接受,只能使用UART0,而0口被repl(串口调试模式)占用,请问你是怎么做的,能提供思路吗。


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-11-20 13:38:32 | 显示全部楼层
youxinweizhi 发表于 2017-11-20 13:28
UART1 只能发送不能接受,只能使用UART0,而0口被repl(串口调试模式)占用,请问你是怎么做的,能提供思 ...

我知道你的意思了,你把调试模式改成UART1呗,有个函数,UART_SetPrintPort(1),可以更改为LOG是从串口1输出

点评

用的是micropython。有这个函数吗  详情 回复 发表于 2017-11-20 13:44


回复

使用道具 举报

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-11-20 13:44:51 | 显示全部楼层
Jason.zhou 发表于 2017-11-20 13:38
我知道你的意思了,你把调试模式改成UART1呗,有个函数,UART_SetPrintPort(1),可以更改为LOG是从串口1输 ...

用的是micropython。有这个函数吗


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-11-20 13:45:38 | 显示全部楼层
youxinweizhi 发表于 2017-11-20 13:44
用的是micropython。有这个函数吗

按理应该是有的,你可以看一下接口函数有没有说明,我这个是用的标准C的

点评

谢谢,困扰好几天了。  详情 回复 发表于 2017-11-20 13:46


回复

使用道具 举报

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-11-20 13:46:40 | 显示全部楼层
Jason.zhou 发表于 2017-11-20 13:45
按理应该是有的,你可以看一下接口函数有没有说明,我这个是用的标准C的

谢谢,困扰好几天了。


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-11-20 13:51:13 | 显示全部楼层
youxinweizhi 发表于 2017-11-20 13:46
谢谢,困扰好几天了。

客气,你去看看吧。有机会我也去看看micropython的使用


回复

使用道具 举报

6429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-11-21 08:07:11 来自手机 | 显示全部楼层
uart1的确只能发 如果要求不高 可以用软件串口

点评

是说其他IO口可模拟串口吗?  详情 回复 发表于 2017-11-21 13:43


回复

使用道具 举报

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-11-21 13:43:30 | 显示全部楼层
dcexpert 发表于 2017-11-21 08:07
uart1的确只能发 如果要求不高 可以用软件串口

是说其他IO口可模拟串口吗?

点评

以前写的一个简单模拟串口的程序。 [mw_shl_code=python,true]import time import machine from machine import Pin class SOFTUART(object): def __init__(self, tx, rx, baud = 1200): self  详情 回复 发表于 2017-11-21 14:50
是的,可以用任意两个IO模拟。不过mpy中没有直接提供软件串口,需要自己做。  详情 回复 发表于 2017-11-21 14:49


回复

使用道具 举报

6429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-11-21 14:49:24 | 显示全部楼层
youxinweizhi 发表于 2017-11-21 13:43
是说其他IO口可模拟串口吗?

是的,可以用任意两个IO模拟。不过mpy中没有直接提供软件串口,需要自己做。


回复

使用道具 举报

6429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-11-21 14:50:21 | 显示全部楼层
youxinweizhi 发表于 2017-11-21 13:43
是说其他IO口可模拟串口吗?

以前写的一个简单模拟串口的程序。

[Python] 纯文本查看 复制代码
import time
import machine
from machine import Pin

class SOFTUART(object):
    def __init__(self, tx, rx, baud = 1200):
        self.tx = tx
        self.rx = rx
        self.tx.init(Pin.OUT)
        self.rx.init(Pin.IN)
        self.baud(baud)
        self.timeout = False

    def baud(self, baud):
        self.bitdelay = 1000000 // baud - 200

    def dt(self, dt=''):
        if dt=='':
            return self.bitdelay
        else:
            self.bitdelay = dt

    def putc(self, dat):
        self.tx(0)
        time.sleep_us(self.bitdelay)
        for i in range(8):
            self.tx(dat%2)
            dat = dat >> 1
            time.sleep_us(self.bitdelay)
        self.tx(1)
        time.sleep_us(self.bitdelay)

    def puts(self, str, cr=1):
        for i in range(len(str)):
            time.sleep_ms(1)
            self.putc(ord(str[i]))
        if cr > 0:
            time.sleep_ms(1)
            self.putc(0x0D)

    def put(self, buf):
        for i in range(len(buf)):
            time.sleep_ms(1)
            self.putc(buf[i])

    def timeout(self):
        return self.timeout

    def getc(self, timeout=20):
        t = 0
        self.timeout = False
        while self.rx():
            time.sleep_us(20)
            t = t + 1
            if t < timeout*5:
                pass
            else:
                self.timeout = True
                return -1
        time.sleep_us(self.bitdelay + self.bitdelay//8)
        dat = 0
        for i in range(8):
            dat = dat >> 1
            if self.rx():
                dat = dat | 0x80
            time.sleep_us(self.bitdelay)
        time.sleep_us(self.bitdelay)
        return dat

    def get(self, num=0):
        dat=bytearray(0)
        while True:
            t = self.getc()
            if self.timeout:
                return dat
            else:
                dat.append(t)
            if num > 0:
                if num > 1:
                    num = num - 1
                else:
                    return dat


点评

这是一个示例?还是可以直接用?  详情 回复 发表于 2017-11-22 14:57


回复

使用道具 举报

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-11-22 14:57:24 | 显示全部楼层
dcexpert 发表于 2017-11-21 14:50
以前写的一个简单模拟串口的程序。

[mw_shl_code=python,true]import time
import machine
from mac ...

这是一个示例?还是可以直接用?

点评

可以用,可以简单的收发数据,但是比特率不能太高。因为采用延时的方式,效率也比较低。  详情 回复 发表于 2017-11-22 20:24


回复

使用道具 举报

6429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-11-22 20:24:57 | 显示全部楼层
youxinweizhi 发表于 2017-11-22 14:57
这是一个示例?还是可以直接用?

可以用,可以简单的收发数据,但是比特率不能太高。因为采用延时的方式,效率也比较低。


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-12-24 11:39:08 | 显示全部楼层
dcexpert 发表于 2017-11-22 20:24
可以用,可以简单的收发数据,但是比特率不能太高。因为采用延时的方式,效率也比较低。

请问为什么我的esp8266 用from machine import UART   很多方法都没有 如uart.deinit()、uart.writechar(char)、uart.sendbreak()...?

点评

ESP8266的串口功能要少一些。一个原因是ESP8266的IO较少,很多功能都是复用的;一个原因是ESP8266和STM32的软件是不同作者,风格上有差异。  详情 回复 发表于 2017-12-24 18:22


回复

使用道具 举报

6429

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-12-24 18:22:01 | 显示全部楼层
leiyong711 发表于 2017-12-24 11:39
请问为什么我的esp8266 用from machine import UART   很多方法都没有 如uart.deinit()、uart.writechar( ...

ESP8266的串口功能要少一些。一个原因是ESP8266的IO较少,很多功能都是复用的;一个原因是ESP8266和STM32的软件是不同作者,风格上有差异。


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-25 15:39:38 | 显示全部楼层
你好,在esp8266上测试了你写的softuart,默认1200波特率的时候工作正常,设成其他就不行了,气体传感器是9600的,感觉硬件本身应该是支持的,但bitdelay要改,而程序里面是写死的,请问有办法解决吗?我在github上搜了,有用c写了直接编译到固件里面去的,貌似能支持9600,还没搭环境试https://github.com/deshipu/micro ... 6128b741c77d6529d39


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-25 16:18:54 | 显示全部楼层
你好,在esp8266上测试了你写的softuart,默认1200波特率的时候工作正常,设成其他就不行了,气体传感器是9600的,感觉硬件本身应该是支持的,但bitdelay要改,而程序里面是写死的,请问有办法解决吗?
我在github上搜了,有用c写了直接编译到固件里面去的,貌似能支持9600,还没搭环境试https://github.com/deshipu/micro ... 6128b741c77d6529d39


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-12-25 18:05:36 | 显示全部楼层
baoyingcheng 发表于 2017-12-25 16:18
你好,在esp8266上测试了你写的softuart,默认1200波特率的时候工作正常,设成其他就不行了,气体传感器是9 ...

你的可以了吗?


回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-26 02:45:29 | 显示全部楼层
本帖最后由 baoyingcheng 于 2017-12-26 02:48 编辑

不行,我又下单买了个esp32s,这个有三个串口,其中一个tty,两个usr,而且不限管脚。
我看淘宝上有一家卖的diy的用的是stm32f103的板子,10块钱左右就能买到,可惜那个只能用C写
版主的软串口bitdelay是用100万除以9600再减200就成负数了。也就是说,基本只能用默认的1200波特率。
而大部分传感器的波特率并不能调,所以就郁闷了。

我在想能不能把那个stm32f103的板子用来转接一下,几个uart接收传感器数据,然后通过其他接口转发给esp8266。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-2-26 09:47 , Processed in 0.518227 second(s), 16 queries , Redis On.

快速回复 返回顶部 返回列表