社区导航

 
查看: 1972|回复: 19

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

[复制链接]

61

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


回复

使用道具 举报

61

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


回复

使用道具 举报

61

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


回复

使用道具 举报

61

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的使用


回复

使用道具 举报

7046

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

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

点评

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


回复

使用道具 举报

61

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


回复

使用道具 举报

7046

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

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

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


回复

使用道具 举报

7046

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

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

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

  1. import time
  2. import machine
  3. from machine import Pin

  4. class SOFTUART(object):
  5.     def __init__(self, tx, rx, baud = 1200):
  6.         self.tx = tx
  7.         self.rx = rx
  8.         self.tx.init(Pin.OUT)
  9.         self.rx.init(Pin.IN)
  10.         self.baud(baud)
  11.         self.timeout = False

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

  14.     def dt(self, dt=''):
  15.         if dt=='':
  16.             return self.bitdelay
  17.         else:
  18.             self.bitdelay = dt

  19.     def putc(self, dat):
  20.         self.tx(0)
  21.         time.sleep_us(self.bitdelay)
  22.         for i in range(8):
  23.             self.tx(dat%2)
  24.             dat = dat >> 1
  25.             time.sleep_us(self.bitdelay)
  26.         self.tx(1)
  27.         time.sleep_us(self.bitdelay)

  28.     def puts(self, str, cr=1):
  29.         for i in range(len(str)):
  30.             time.sleep_ms(1)
  31.             self.putc(ord(str[i]))
  32.         if cr > 0:
  33.             time.sleep_ms(1)
  34.             self.putc(0x0D)

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

  39.     def timeout(self):
  40.         return self.timeout

  41.     def getc(self, timeout=20):
  42.         t = 0
  43.         self.timeout = False
  44.         while self.rx():
  45.             time.sleep_us(20)
  46.             t = t + 1
  47.             if t < timeout*5:
  48.                 pass
  49.             else:
  50.                 self.timeout = True
  51.                 return -1
  52.         time.sleep_us(self.bitdelay + self.bitdelay//8)
  53.         dat = 0
  54.         for i in range(8):
  55.             dat = dat >> 1
  56.             if self.rx():
  57.                 dat = dat | 0x80
  58.             time.sleep_us(self.bitdelay)
  59.         time.sleep_us(self.bitdelay)
  60.         return dat

  61.     def get(self, num=0):
  62.         dat=bytearray(0)
  63.         while True:
  64.             t = self.getc()
  65.             if self.timeout:
  66.                 return dat
  67.             else:
  68.                 dat.append(t)
  69.             if num > 0:
  70.                 if num > 1:
  71.                     num = num - 1
  72.                 else:
  73.                     return dat

复制代码

点评

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


回复

使用道具 举报

61

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

[code]import time
import machine
from mac ...

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

点评

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


回复

使用道具 举报

7046

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


回复

使用道具 举报

7046

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-9-20 19:00 , Processed in 0.512129 second(s), 17 queries , Gzip On, Redis On.

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