【雕爷学编程】Arduino动手做(59)---RS232转TTL串口模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)

实验五十九: RS232转TTL2代串口模块刷机板模块(MAX3232芯片)

 

 

MAX3232芯片

采用专有低压差发送器输出级,利用双电荷泵在3.0V至5.5V电源供电时能够实现真正的RS-232性能,器件仅需四个0.1uF的外部小尺寸电荷泵电容。max3232确保在120kbps数据速率,同时保持RS-232输出电平。max3232具有二路接收器和二路驱动器,提供1uA关断模式,有效降低功效并延迟便携式产品的电池使用寿命。关断模式下,接收器保持有效状态,对外部设备进行监测,仅消耗1uA电源电流,max3232的引脚、封装和功能分别与工业标准MAX242和MAX232兼容。即使工作在高数据速率下,max3232仍然能保持RS-232标准要求的正负5.0V最小发送器输出电压。

 

MAX3232是MAXIM公司生产的一款 232通讯的芯片,他可以将单片机的逻辑信号的电平转成RS232的电平。因为RS232是用,正负电平来表示0和1的信号,所以MAX3232要产生相应的正负电压。在使用MAX3232时,先确定一下系统接供的电压,因为此芯片,对不同的工作电压,要给不同的电容来产生电压。通电后,先检测一下2脚是否有+5.4V以上的电压,6脚有-5.4V以上的电压,16脚是否有电压, 如没有则要检查相应的电容。注意在16脚一定要有电容,要不然就可能不能产生相应的电压。

RS232转TTL2代串口模块刷机板模块(MAX3232芯片)

DB9串口

DB9管脚功能

1 、DCD( Data Carrier Detect) :载波检测。主要用于Modem通知计算机其处于在线状态,即Modem检测到拨号音,处于在线状态。

2 、RXD(Receive(rx) Data):此引脚用于接收外部设备送来的数据;在你使用Modem时,你会发现RXD指示灯在闪烁,说明RXD引脚上有数据进入(电脑的2接MAX232的RS232端TOUT(如PIN7))。

3 、TXD(Transmit(tx)  Data):此引脚将计算机的数据发送给外部设备;在你使用Modem时,你会发现TXD指示灯在闪烁,说明计算机正在通过TXD引脚发送数据。

4 、DTR( Data Terminal Ready ):数据终端就绪;当此引脚高电平时,通知Modem可以进行数据传输,计算机已经准备好。

5 、GND(Ground):逻辑地。

6 、DSR(data set ready):数据设置就绪;此引脚高电平时,通知计算机Modem已经准备好,可以进行数据通讯了。

7 、RTS(Request To Send):请求发送;此脚由计算机来控制,用以通知Modem马上传送数据至计算机;否则,Modem将收到的数据暂时放入缓冲区中。

8 、CTS(Clear to send): 清除发送;此脚由Modem控制,用以通知计算机将欲传的数据送至Modem。

9 、RI ( Ring Indicator): Modem通知计算机有呼叫进来,是否接听呼叫由计算机决定。

要想实现串口间通信,至少需要三个引脚,即:RXD,TXD,GND,RXD与其他串口线TXD相连,TXD与RXD相连,GND与GND相连,这样就实现了串口间通信。该通信是全双工的,即可以同时发送/接收数据,虽然说是串行的,但是因为发送/接收不是用的一个通道,所以可以实现全双工。

 

DB9与MAX3232的连接电路图

模块电原理图

实验开源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
 
【Arduino】168种传感器模块系列实验(59)
 
实验五十九: RS232转TTL2代串口模块刷机板模块(MAX3232芯片)
 
程序之一,读取缓存中的串口数据
 
注意这里的接线方法,软串口RX接RS232转接板的RX口,
 
TX接RS232转接板的TX口
 
*/
 
  
 
#include <SoftwareSerial.h>
 
SoftwareSerial DLSerial(6, 7); // 软串口 RX(D6), TX(D7)
 
void setup() {
 
DLSerial.begin(9600); //设备波特率9600
 
}
 
  
 
void loop() {   
 
DLSerial.write(1); //发送字节数据
 
DLSerial.write(3);
 
delay(500);
 
while (DLSerial.available()>0) //如果缓存中有接收到的数据
 
{
 
    DLSerial.read(); //读取缓存中的串口数据
 
    delay(2);
 
}
 
delay(500);
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
 
【Arduino】168种传感器模块系列实验(59)
 
实验五十九: RS232转TTL2代串口模块刷机板(MAX3232芯片)
 
程序之二,接收串口数据
 
rx = 6
 
tx = 7
 
*/
 
  
 
#include <ctype.h>
 
  
 
#define bit9600Delay 100 
 
#define halfBit9600Delay 50
 
#define bit4800Delay 188
 
#define halfBit4800Delay 94
 
  
 
byte rx = 6;
 
byte tx = 7;
 
byte SWval;
 
  
 
void setup() {
 
  pinMode(rx,INPUT);
 
  pinMode(tx,OUTPUT);
 
  digitalWrite(tx,HIGH);
 
  delay(2);
 
  digitalWrite(13,HIGH);
 
  SWprint('o'); 
 
  SWprint('k');
 
  SWprint(10);
 
}
 
  
 
void SWprint(int data)
 
{
 
  byte mask;
 
  
 
  digitalWrite(tx,LOW);
 
  delayMicroseconds(bit9600Delay);
 
  for (mask = 0x01; mask>0; mask <<= 1) {
 
    if (data & mask){
 
     digitalWrite(tx,HIGH);
 
    }
 
    else{
 
     digitalWrite(tx,LOW);
 
    }
 
    delayMicroseconds(bit9600Delay);
 
  }
 
   
 
  digitalWrite(tx, HIGH);
 
  delayMicroseconds(bit9600Delay);
 
}
 
  
 
int SWread()
 
{
 
  byte val = 0;
 
  while (digitalRead(rx));
 
  
 
  if (digitalRead(rx) == LOW) {
 
    delayMicroseconds(halfBit9600Delay);
 
    for (int offset = 0; offset < 8; offset++) {
 
     delayMicroseconds(bit9600Delay);
 
     val |= digitalRead(rx) << offset;
 
    }
 
     
 
    delayMicroseconds(bit9600Delay);
 
    delayMicroseconds(bit9600Delay);
 
    return val;
 
  }
 
}
 
  
 
void loop()
 
{
 
    SWval = SWread();
 
    SWprint(toupper(SWval));
 
}

  

实验仿真编程(linkboy)

posted @   行者花雕  阅读(3840)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示