关键字:arduino、esp8266、esptool、pyserial、macos
时间:2021年10月

一、问题

Arduino对esp8266进行upload时,报错

pyserial or esptool directories not found next to this upload.py tool.
An error occurred while uploading the sketch

二、解决办法

1、打开文件

~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/pyserial/serial/tools/list_ports_osx.py

2、注释掉29和30行

#iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))
#cf = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))

3、添加两行

iokit = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/IOKit.framework/IOKit')
cf = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation')

关键字:udp、打洞、流程、关键、失败、拒绝、原因
时间:2021年10月

一、流程
1、客户端A向服务器发送任意数据,服务器记录客户端A的公网IP和端口,暂不应答客户端A;
2、客户端B向服务器发送任意数据,服务器把之前记录的客户端A的公网IP和端口发送给客户端B,同时把客户端B的公网端口和IP发送给A;
3、客户端A对收到服务器发来的客户端B的外网IP和端口立即发送数据,客户端B对收到服务器发来的客户端A的外网IP和端口立即发送数据;
4、客户端A和客户端B正常收发对方数据。

二、关键点
1、家用宽带基本都是可以UDP打洞的(Symmetric NAT很少见),没有成功通常是代码问题;
2、客户端本地端口可以固定也可以随机,但必须保证发送数据到服务器和发送数据到另一客户端使用相同的端口;
3、尽量保证两个客户端对发第一条数据在同一时刻,否则出现连接拒绝(refused)的概率很大。
4、实际打洞时,会有一定概率连接拒绝的情况,重新打洞即可,最好不要固定本地端口。

提供以打洞成功的源码,仅供参考:https://gitee.com/gitee211012/udp_hole_punching.git

关键字:nat、vsftp、passive、被动模式、配置
时间:2021年10月

问题1 需要哪些准备工作?
答:了解FTP主动模式和被动模式,了解端口映射工具iptables或lvs。

问题2 主动模式与被动模式如何选择?
答:对于公网FTP服务而言,主动模式是行不通的,只能采用被动模式。

问题3 被动模式需要映射哪些端口?
答:被动模式下,21端口的连接用于指令传输,FTP服务器会动态打开监听端口用于传输文件数据,端口号可配置。因此,仅映射21端口是不够的。

问题4 vsftp如何配置被动模式
答:
1、pasv_enable=YES启用被动模式;
2、pasv_min_port=60000和pasv_max_port=60010设置监听端口范围60000~60010,根据自己的情况修改范围值;
3、pasv_address=x.x.x.x设置ftp服务器的外网IP
修改完配置后,记得重启vsftp

问题5 端口映射如何配置
答:NAT网关上安装lvs,执行”ipvsadm -A 172.16.0.1:21 -s rr”、”ipvsadm -a 172.16.0.1:21 -r 172.16.0.105:21 -m”两条命令,完成21端口的映射,其他端口以此类推。pasv_min_port与pasv_max_port之间的端口均需要映射,172.16.0.1是NAT本机地址,172.16.0.105是FTP服务器地址,别替换错了。

问题6 客户端登录正常,无法获取文件?
答:因为pasv_address设置的是IPv4地址,需要屏蔽listen_ipv6=YES,并设置listen=YES。

问题7 如何限制用户的根路径?
答:限制用户的根路径设置不当,反应的现象看起来和网络问题很想,很容易误认为是被动模式配置或端口映射有问题。只需要注意chroot_local_user=YES和allow_writeable_chroot=YES配合使用即可,allow_writeable_chroot在vsftp老版本中并不需要配置,但在新版本中,如果不配置为YES,会涉及一系列目录权限的修改。

关键字:stc15f104w、linux、编译、烧录、stcgal、sdcc、stc15
时间:2021年4月

编译与烧录

user1@debian:~/example$ sdcc -mmc51 --iram-size 128 --xram-size 0 --code-size 4096 "main.c"
user1@debian:~/example$ stcgal -b 1200 -P stc15 main.ihx

常见问题

Switching to 19200 baud: Protocol error: incorrect frame start
Switching to 19200 baud: Serial port error: read timeout

波特率降低到1200即可解决。

关键字:ds1302、时间、归零、清零、注意
时间:2020年12月

接口协议

DS1302的接口不是SPI,也不是I2C,只能通过GPIO按照时序控制。SPI输入和输出是MOSI和MISO,而DS1302输入输出都是DAT脚;I2C有地址应答,而DS1302没有地址应答。

接口连接

DS1302的CLK、DAT、RST脚必须接上拉电阻(4.7K或10K),否则会造成时钟归零问题出现。曾经遇到过一个案例,STM32+DS1302+MAX7219显示时间,每次MAX7219上电,都会造成DS1302时钟归零,加上上拉电阻后,问题解决。

关键字:433MHz、无线、接收、发送、FS1000A、MX-RM-5V
时间:2020年11月

发送模块FS1000A

发送模块有3个脚,分别印有GND、VCC、ATAD。ATAD脚用于接收来自单片机或串口TX脚的电平信号。

接收模块MX-RM-5V

接收模块有4个脚,PCB上只印刷了GND和VCC,中间两个脚是连通的,我们把他标记为DATA脚。DATA脚用于发送电平信号给单片机或串口的RX脚。

接线

+-----------+    +-----------+    +---------+
|  MX-RM-5V |    | USB-UART  |    | FS1000A |
|           |    |           |    |         |
|       VCC |<-->| 5V     5V |<-->| VCC     |
|      DATA |<-->| RX     TX |<-->| ATAD    |
|       GND |<-->| GND   GND |<-->| GND     |
+-----------+    +-----------+    +---------+

测试

打开一个串口调试工具,波特率选择2400或4800,输入字符点击发送按钮,观察接收到的内容。

注意

1.433MHz频率承载的数据带宽有限,高于4800波特率的数据基本无法正确接收。
2.通常433MHz频率干扰信号是存在的,串口调试工具收到异常数据属于正常现象,如果用于实际通讯,需要加校验位。

1. 打开官网www.st.com;
2. 搜索stm32f1;
3. 找到Recommended Links,点击链接STM32F1 Series;
4. 点击Tools&Software标签;
5. 依次找到All tools & software types > Embedded Software > MCU & MPU Embedded Software > STM32 Standard Peripheral Libraries;
6. 在表格中的General Description列,找到STM32F10x standard peripheral library,点击STSW-STM32054

uint64_t delay_ticks;

void SysTick_Handler(void) {
	if (delay_ticks > 0) {
		delay_ticks--;
	} else {
		SysTick->CTRL = 0x00;
		SysTick->VAL = 0x00;
	}
}

void delay_us(unsigned long n) {
	delay_ticks = n;
	SysTick_Config(SystemCoreClock/1000000);
	while(delay_ticks);
}

void delay_ms(unsigned long n) {
	delay_ticks = n;
	SysTick_Config(SystemCoreClock/1000);
	while(delay_ticks);
}

注:SystemCoreClock在头文件system_stm32xxx.h中有定义。

关键字:stm32、标准库、16m、晶振、串口、乱码
时间:2020年4月

问题

STM32F030是48MHz主频,标准库STM32F0xx_StdPeriph_Driver的相关代码默认外部晶振为8MHz。通常可以通过定义HSE_VALUE宏,来修改晶振频率。但是只修改HSE_VALUE为16M,主频则变成了96MHz,MCU处于超频状态运行,不能长期运行,并且会影响串口、SPI、I2C等外设的正常运行。

解决方法

修改PREDIV和PLLMUL两个寄存器,从而使主频(SYSCLK)回到正常的48MHz。原理参考STM32F030F4数据手册“clocks and startup”章节。

stm32f0xx.h文件

修改前

...
#if !defined  (HSE_VALUE)     
#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/
#endif /* HSE_VALUE */
...

修改后

...
#if !defined  (HSE_VALUE)     
#define HSE_VALUE    ((uint32_t)16000000) /*!< Value of the External oscillator in Hz*/
#endif /* HSE_VALUE */
...

system_stm32f0xx.c文件

修改前

...
static void SetSysClock(void)
{
  ...
    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
  ...
}
...

修改后

...
static void SetSysClock(void)
{
  ...
    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6);
  ...
}
...

或者修改后

...
static void SetSysClock(void)
{
  ...
    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL3);
  ...
}
...

关键字:android、strongswan、vpn、mtu、1360、无法上网
时间:2019年11月

现象

iPhone手机连接已经配置好strongswan的VPN服务器,已经能够正常访问公网。
Android手机连接同一台VPN服务器,手机状态栏已经出现VPN图标,但无法打开网页。

解决办法

在VPN服务器端执行如下脚本

root@debian:~# iptables -t mangle -A FORWARD -s 10.0.0.0/24 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360

10.0.0.0/24为你的手机连接vpn获取的ip地址池。

原因分析

Android手机连接VPN后的MTU协商值不太合适,通过iptables拦截MTU协商包并强行修改为1360。