## **串口雙向調用(使用ASCII字符串)**
> 本例向你展示如何使用握手連接在Arduino和Genuino板和電腦之間建立以字符串為載體的通信(本例與4-8的不同在下面有提到)。?
> 代碼最開始在**setup()**中不斷輸出一個**ASCII字符串**到串口監視器,直到收到電腦的“回復”(收到電腦的一個byte)才進入**loop()**。第一次進入**loop()**后代碼將三個傳感器的值用ASCII解碼過的字符串形式發送到電腦一次。(這個字符串以逗號分隔,以換行符結束)而后在loop循環中,程序一直等待電腦的信息(不會再發送字符串),直到下次再收到一個來自電腦的byte再返回三個傳感器值一次,不斷重復。
你可以使用Arduino IDE 串口監視器來查看數據,或者也可用Processing(下附代碼),Flash, PD, Max/MSP(下附補丁)等代替。 下面的例子將發來的string用逗號分隔,并且再次將String轉換為數字。
> 如果你將這個例子和**[4-8 串口雙向調用 (握手連接)](http://blog.csdn.net/amagamag/article/details/51375212)**比較,就會發現它們很相似——都使用了握手連接。但是4-9與4-8的不同之處在于,本例將傳感器值讀成字符串,而4-9中是將傳感器值直接用二進制形式(byte)發送。雖然說以String發送要在串口傳輸更多的字節,可是**用String你可以隨意發送大于255的值而不受byte的限制**。**而如果以字符串發送,接收端處理的時候也會更加容易些**。?
> 【譯者注:讀者可多關注**String操作的部分**。其他代碼和文字與4-8差不多。】
### **所需硬件**
* Arduino板或Genuino板
* 2個模擬信號傳感器(電位器, 光電管, 壓力傳感器等等均可)
* 按鍵
* 3 個10kΩ電阻
* 跳線
* 面包板
* 連接線
### **所需軟件**
Processing 或 Max/MSP version 5.x
### **電路**

將模擬信號傳感器連接到A0口、A1口(還要用10kΩ電阻進行分壓)。然后用一個10kΩ電阻連接按鍵或者開關到A2口。
### **原理圖**

### **程序邏輯**
#### **Arduino程序流程圖**
(此處為流程圖,如果看不見可能是瀏覽器問題)
進入setup()函數establishContact() {Arduino不斷發送握手連接請求信號}是否收到電腦請求字節?進入loop()函數yesno
進入loop()函數串口是否有數據?返回三個傳感器值yes
大家可以這樣理解
1. Arduino第一次收到輸入之前處于“**空閑狀態**”,因此不斷廣播信息:“**我已經準備好,如果要傳感器信息就來吧**”。【**Arduino嘗試找電腦握手**】
2. 電腦說:“**Arduino,我日后要串口數據,我和你握手**”,這時Arduino就知道電腦要數據了。因此就不再發送“**我已經準備好……**”的信息。默默等待電腦需要數據的時刻。Arduino目前出于“**等待狀態**”,等待給電腦發送傳感器信息。【**電腦和Arduino握手成功**】
3. 電腦說:”**現在給我數據**“。Arduino返回三個傳感器值,然后繼續等待電腦的下一個請求。【**握手成功后的通信**】
這就是握手連接,大家也可以網上搜搜握手連接的含義和作用。
### **代碼**
~~~
/*
串口雙向調用(使用ASCII字符串)
語言: Arduino
代碼不斷輸出字母A到串口監視器(用ASCII方式,對應byte值65),
代碼最開始在setup()中不斷輸出一個ASCII字符串到串口監視器,直到收到電腦的“回復”(收
到電腦的一個byte)才進入loop()。第一次進入loop()后代碼將三個傳感器的值用ASCII解
碼過的字符串形式發送到電腦一次。(這個字符串以逗號分隔,以換行符結束)
感謝Greg Shakar和Scott Fitzgerald 改善代碼
電路搭建:
* 兩個電位器分別連接到A0、A1
* 按鍵連接到2號引腳
代碼是公開的。
*/
int firstSensor = 0; // 第一個模擬信號傳感器
int secondSensor = 0; // 第二個模擬信號傳感器
int thirdSensor = 0; // 數字信號傳感器
int inByte = 0; // 收到的串口數據
void setup() {
// 用9600波特率打開串口:
Serial.begin(9600);
while (!Serial) {
// 等待串口建立完成,只有當使用本地USB口時有用
}
pinMode(2, INPUT); // 2號引腳為數字傳感器
establishContact(); // 發送字符串到電腦,直到電腦發送回來數據才返回
}
void loop() {
// 如果串口有一個byte的數據,就讀取傳感器值:
if (Serial.available() > 0) {
// 獲取發送來的byte:
inByte = Serial.read();
// 讀取第一個模擬信號傳感器
firstSensor = analogRead(A0);
// 讀取第二個模擬信號傳感器
secondSensor = analogRead(A1);
// 讀取開關,將值映射到0-255
thirdSensor = map(digitalRead(2), 0, 1, 0, 255);
// 發送傳感器值:
Serial.print(firstSensor);
Serial.print(",");
Serial.print(secondSensor);
Serial.print(",");
Serial.println(thirdSensor);
}
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.println("0,0,0"); // 發送初始化字符串
delay(300);
}
}
~~~
#### **Processing代碼**
將下列代碼拷貝到Processing工程,當你改變模擬信號傳感器時,你會看到屏幕上有一個小球跳動。只有當你按下按鈕時才會看到小球?

~~~
// 代碼公開.
import processing.serial.*; // 導入Processing串口庫
Serial myPort; // 當前串口
float bgcolor; // 背景色
float fgcolor; // 填充色
float xpos, ypos; // 小球初始位置
void setup() {
size(640,480);
// 將串口枚舉并且輸出
// 如果使用Processing 2.1或更早版本,使用Serial.printArray()
println(Serial.list());
// 在我的mac上第一個總歸是Arduino,因此我直接打開了Serial.list()[0]。
// 下列代碼根據你使用的串口進行調整。
myPort = new Serial(this, Serial.list()[0], 9600);
// 將字節存入數組直到收到換行符(換行符ASCII碼為10):
myPort.bufferUntil('\n');
// 用邊緣平滑模式畫圖:
smooth();
}
void draw() {
background(bgcolor);
fill(fgcolor);
// 畫球
ellipse(xpos, ypos, 20, 20);
}
// serialEvent函數是由Processing applet自動調用的。(applet會在串口收到setup函數體中的bufferUntil()傳入的那個字符時回調serialEvent(本代碼用了換行符\n))
void serialEvent(Serial myPort) {
// 讀取串口字符串:
String myString = myPort.readStringUntil('\n');
// 如果你收到了換行符以外的字符時:
myString = trim(myString);
// 將用逗號分隔的string,并且將傳感器值轉換成整型數組
int sensors[] = int(split(myString, ','));
// 將收到的值輸出:
for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) {
print("傳感器 " + sensorNum + ": " + sensors[sensorNum] + "\t");
}
// 在所有內容輸出后添加換行符:
println();
if (sensors.length > 1) {
xpos = map(sensors[0], 0,1023,0,width);
ypos = map(sensors[1], 0,1023,0,height);
fgcolor = sensors[2];
}
// 發送大寫字母A,請求Arduino反饋更多的數據:
myPort.write("A");
}
~~~
#### **Max補丁**

~~~
----------begin_max5_patcher----------
3640.3oc6cs0jZajE94Y9UzKkeHoVloTeSHkm1II0VkeHIthSs6C1obIjZ.E
KjHRhY7jT4+9d5KBj.jTCAXfoV6x.sj5VmyWet127ed6MCFm8EQw.z2f9.5l
a9yau4F0kjW3FS4aFLO3KgIAEpGaPX174hzxAC02qT7kR80mkkUHPAnBQdbP
BZQVdIZRd1bT4r3BDTmkU0YQPY3r3zoeJWDVpe2ttr6cFhvXt7KhyH8W26f9
USkhiTulrw+1czQUszjrzxzf4B0sdP9dqtS5x4woIhREQiWewrkkUW0oViTD
+GpFASt2Qd0+51akeLzRPIU7DPXagIFnH.4653f9WAKKyxVHRQNcfDXlih2w
puvbdWHAlcTPBRKHg4x5mr74EBMINHV1+iFL.8qG.VMWTTDLUrs.TBH+zAvP
nTEhvvxun9pBd6FWH38DWH6DWv6ItbX.RKBOJ7XbP5ztvDesvhBLb6VTwcOg
DmiBjnXfiIrjjED0CpP490PEmtPExwQA5EGUVjK.CKQJqtcYl0nCMRAJi76D
Z7dQflCCVV1i+ENiTy3AwYaghEA4.KVJx+jHMXbhntJPceO3iBpPOPKtZqtU
jUoXtw28fkEimmEIlOI.3Q4iMT9wO+iLxc9O7sN28928t6Ve8uMYo.7EUN6t
ePVoUW+6E4hOW7CAgeaV1meWd1cuWnYLy8mKhhClGDd25F3ce+C2si1Ud42+
bZ3IQJOXg7q96t80e50YvDjqHw7VvkRTXhHHuKEerRwmqfBFsS.g9h.HZN3X
hJf5Qd+xHZHgzc.mrqeYjbn4E84evfIDUjDtjNwD2iRHV6anmGdbmsfKxTTJ
dd93rjtBJ2U42foCwZDqKfYzKkrh4VgYIY4FxVRmN2646f8ck+xw7KrjzOlZ
ZYAVfdZgKlaWn29FzA8nfdR2quj.3ejflBJnKr.Dwpf13cZBm85P0rPj.rOB
6fvztPFGkVI0SAPi5NKHmih7E8Ph2e35uOtYN6x6JEQtJVWpV7gRtm2dZy9W
+YMCxLHrEvAknQktDVdY7v82SFosgmSGHO56BRRt6mEEKxRKDnGd+2812h9X
5GSeODOcAJ.M9YHHAfjPkyD0GIugn.Ht6bQ.7TTS8DoPtCQCQxWobX+jYPUJ
hPn3zgnx7kogphieFZ2j3TwDgH5dzaUscJ77kEnIY4hoYKglVYzcH5KKxJzu
qmgegxl.0MLNGBNDsr.5IUz0iAPZFE.0TtLOEdClQYrAAeORwW+XVo3aP+hb
DHUBCH.mfbEKfGOPyjQhGiCAdNUUBRcQjij4X.u5MZRDzHSyTDQFbcYdHHIM
AzlF1lnoLjKG8UZH5guV1vEkA4kKWbOPGPC9YgjNdJHVy+ZJQ1.Cq.FUWQpA
ke.8DbUwi.YEWBUCDhPyAXCEETFbuhICg9EIRiYnGVjKyt0+io.r+9vrxRz+
Nt7OlJxCRhT35u.X0amlI9X5xEQppQwneJrLarPVU7JkGYWVHz2njevz1UoX
XkoEWOkxDWO9kXYocoTwuzF611zXJyimB3F5qf9nOT9qesryJTJ1EOcV4cIh
IPVWYoOBUMFTl.4sGRRzRT4AOIkRjn8h7LnNJI2mhg6OSk5JZrPJ4i9gfu.R
w+NHLCcpfAMij88n+qTPPMt4UTwj3bAnY.h.aIe.RiAEeF8Pdzx3zLkLUs1Z
mcmczah0FH4ZmpLcp.rVbX3d0zalKhSiKAxBZ9BU2zTP3uPobgL1Q.U0.kl+
jcBZj1AMOpzsJYjdz0n53QXsfYrqELKblH7yUFoDfPVXbrwDGXqCjwjviT7a
rXZbpxOvxzXvpOnPH0GlTJMZog8l2UZJcdPjxjG7ywIYgeFULaInFDk8jpxZ
apvMA4cv9X.7.vaRRGFAcPYHMR0dF2BZC7wEJ2TOKeZnCRD+HzJo.OLWSW6r
qk2wfI6pGf.pdjC4rpfL2YeK8JYloVf93.ocJEvocv9wAcEiMQgBtl.lb0y9
heKnvtGRs+iHOJHM3uaZbN1jDrhED4FfwfLPCEmH8jV.BB0Z+aF.Vkqc4apU
EIb9a5zAcGt5Rf3WdsNJ3R4PXDU0mouHzIca0MWO.KpQjT8oq1SIyqV3mP24
ToxfHpdyOPNqgwoK.W.fxfRNtwsiDSBVlT9ociSMu+jfPQqUtk9paFLMONJK
URFMpq7xUuvOXF1HBuN6ndhzfE6nxPXQkKKFGjKQNyHtSptYYVVRyaspyBD3
CRiA0YQYrlbgHdptY77E4wZk5UWSOf9yJByyRRZzT5673NtiNrvmhiJmoZq5
fI73wKp5DFrBihhmBNxadsxfoEMuRiIbutfVcM4FWuyr.2bvrlNF5.3U+q9C
sKaa5jkMt70iSd8bC2ZbEFUuAa0DWqYF0tJ91p43649br2nZ2usLGuoxrnQq
6TArNx+1CjRLPpVWf62Kj59ZFRa38Y6D0kRo8AnT8b0g0e4p8+f6.P4sBnaX
TqMmPsOdOcjG+dMtOmdzcgLdIGqjX0J+FAVrmSu.L8fAX19Ky1C.e1.z+IB2
qpeCIUV+.I4fARxQGH0i.9ECVZrhZMTheMCkc4XRMsoCgbef2ZFjaF5MXzaH
n2PQugYmhe0WjdcU47Z1Ukhb6CwFISy2HNtcvtaNRWdshHNVgHcNMUlopRm4
tJByyLXfI0UN6GM7eUiFTm8BMbctZQC8atOegDu6oveXrgpeaGnfaETvsBJN
6AKuNsT4n+zRVXJtQd+ciEEYKyCq.8ptRTSdBRQrLNcUd5eXcjoa7fyhihZl
UrNQxBYZo5g.vpdt8klkJi1QyPvdH7UFMStbvYu8Amu1nY7ECMKGXBqnY2KH
Z18Jjl4aYNnEYiQWVzrUxytWNzL0VZ14xglI6isN5kAMi2GZlbYPyNma6FqC
aJRs9qEogO+ovfvYFxxjGV07cLnH3QQzm.R.BG7SAkk4wiWVpC2p9jwX23ka
0zSz4M6e1QZY.8mljMNHwLURqZ9FuzslMk8ZJXtcMPeblVut1XYDhdMCpmjZ
8BAqsU9DezKxJAa8Hmbbfi+wccuVv7c0qELrEHB+UAhHWzCfCbKPEyBki24Z
clythVwfkYSmlHrPdX8tC5v1iPb5ArPuOWc8NVrRZspq24UxhE0wBcAsMyt2
2LLuqvkKZRXjEq5CM6S3tq9Zm6HD+8Prm0F+jDWn1paUe+2ZuF259kxkiR5W
Qf6vzKBtMm+gFrMeuWsKW.6B61VyWOFjz0Zsmwza+.ikxQcAL3iDtbLWMTKm
OtyMEFcjWM9iu0rMa81D8kUl3v2ewcHWP5B2HX6kK7t7DL5fs6JVIrO0Z1l3
bEpOP3zih9.gbspPzKDYbRVAQ7CFhtZsYzhW1ko0WEJcG3oAC0aRIyxKsUEI
+iDPwOLfp0uNA68MmtSUSmRuNb8d1ttWya7sVWf5Iwf.1LQtZUnqNvT1bS6z
E5o2vfqNSH5bufQbuZV09M.E04Mj8XBUiBqNGl5FSt3NGlZaGRpV6wc4kiWi
q0twaaORhul1jjsIi7cMjQlJJUaQuhR495nlfRQWRJXkrgmMGXWjKM4jdGJH
yovkl4HUetutzWuY5tjFHneGn77rtG3iJ92whCVJxKhBwgGtRaFIzabfNrRn
WThd9q24vsZjf9JvHwOKBhprFDmtXYIZ7xISjaO1GE4OK2V9yiS.qFhvrznh
8cKyMZs7EVepT01FlCe0rIC0lUk6NX4N9syCyAE660+ovE9hyGqjaGurrLak
G0YwoMlFO4YMSZjd9DcWucsjUr1Yqgy8TluCY3N9Q8.+k0JCD3ZTS0CW8Qyb
s19nOxrgjw7VFU+3ooYviK66pCfimt8AAxHOOBkK+EajC2yayWtciMzgdvpM
NKORj29YyGcS4wFVlql0wcZTg1yw5wvMNiTpuUzpu.Y0miRlgO0w7wpZI2Em
SUBGayVM5eqU4C+rV4ZSPkvXqLJbAHlR3mKwT5ISL8+Kv0k.GWEKwpP3ewk3
7omKIN7EtDmp4ZtHk0BfatXgLhgasHgZrVYaY8AIO7fq8Pas1fFzjd4ibwpd
XO4GXOeOG+lcyasNh1R+wVx2yBxeTOT+wiZFYA0P48PNyiiVjAhJlNT4Qvpb
uj3aN2qYqJcBfSWhMbf+YCPcsfbNeTC2l9WNc+5eIlkST0RJgupzIn+kysgC
X6GGXnYpdYfP0GP6MKQXM3N1Ih6XVvcLuym7B0B5w8v.ahqBI49qJcJ.TaX.
N+xBP4NGHhhqYfkRNM9q1f3ZweqyYCQYdGCSZGQ5wBx47o.Ssw+CkcgQOmud
KZic4QKzCw+7ROm8nY2LfMsEDtdfeMKSn5Ev95IQhorcqJcBrzPsQUhRNe8M
1X6lhOezC4Bidv1nKcFs8YimJ9n8RWZXiO7aSCxDRLdjd91qU5TnmXCeRvmR
9jnm7b15RmJ9rO4Kr+IgO04BfczyOpqx9npzofOsIlaR8Mo0IUMR48i0mYly
lVMwlw6gbloGRezy4yKEw6BHBBWik.eRi3DNM5KDahS.SOE1EjmXl7Uyqo9T
AtQAO8fG3oLX3cZFxKh0FLNSRfDaoG74gdvW.ZDU9FMGSdFMBt+IQh.6eIvw
FujTkJREGKKcJ3X2WtXf7Ub1HywEqxh2tJnE.FcZhMByrcXQw1x+bOWJYjpy
lv8oq55aEHLcwD8hJjxbVU5EigcNtL7Ql76KVVp69Huhcb87vpoCkRYT+96v
Hd5Ay1rofMqm+FkLYvv0+GL3FkL6bLp21kL6QFNV8BNM48foWBV4zt1wXm5V
4jkNEbL45dtNw13Iltmi9sAyY0S0l8BR+3yWjVXax7eOmKrp4m0QKIal6VYo
SAf5XQxSrCa5l0qk45k5kAzqEgMNgzkz9FmL5abpnu4IhNzZ+0s+OKCSg0.
-----------end_max5_patcher-----------
~~~
### **相關資料**
[serial.begin()](https://www.arduino.cc/en/Serial/Begin)?
[serial.available()](https://www.arduino.cc/en/Serial/Available)?
[serial.print()](https://www.arduino.cc/en/Serial/Print)?
[analogRead()](https://www.arduino.cc/en/Reference/AnalogRead)?
[map()](https://www.arduino.cc/en/Reference/Map)?
- 說明
- 系統示例文件目錄結構及說明
- 01.Basics
- AnalogReadSerial
- BareMinimum
- Blink
- DigitalReadSerial
- Fade
- ReadAnalogVoltage
- 02.Digital
- BlinkWithoutDelay
- Button
- Debounce
- DigitalInputPullup
- StateChangeDetection
- toneKeyboard
- toneMelody
- toneMultiple
- tonePitchFollower
- 03.Analog
- AnalogInOutSerial
- AnalogInput
- AnalogWriteMega
- Calibration
- Fading
- Smoothing
- 04.Communication
- ASCIITable
- Dimmer
- Graph
- Midi
- MultiSerial
- PhysicalPixel
- ReadASCIIString
- SerialCallResponse
- SerialCallResponseASCII
- SerialEvent
- SerialPassthrough
- VirtualColorMixer
- 05.Control
- Arrays
- ForLoopIteration
- IfStatementConditional
- switchCase
- switchCase2
- WhileStatementConditional
- 06.Sensors
- ADXL3xx
- Knock
- Memsic2125
- Ping
- 07.Display
- barGraph
- RowColumnScanning
- 08.Strings
- CharacterAnalysis
- StringAdditionOperator
- StringAppendOperator
- StringCaseChanges
- StringCharacters
- StringComparisonOperators
- StringConstructors
- StringIndexOf
- StringLength
- StringLengthTrim
- StringReplace
- StringStartsWithEndsWith
- StringSubstring
- StringToInt
- 09.USB
- Keyboard
- KeyboardLogout
- KeyboardMessage
- KeyboardReprogram
- KeyboardSerial
- KeyboardAndMouseControl
- Mouse
- ButtonMouseControl
- JoystickMouseControl
- 10.StarterKit_BasicKit (與特定硬件相關,暫無)
- p02_SpaceshipInterface
- p03_LoveOMeter
- p04_ColorMixingLamp
- p05_ServoMoodIndicator
- p06_LightTheremin
- p07_Keyboard
- p08_DigitalHourglass
- p09_MotorizedPinwheel
- p10_Zoetrope
- p11_CrystalBall
- p12_KnockLock
- p13_TouchSensorLamp
- p14_TweakTheArduinoLogo
- p15_HackingButtons
- 11.ArduinoISP(暫無)
- ArduinoISP