請問有冇高手識用Arduino寫一段 讀Serial. Monitor輸入嘅數字

24 回覆
1 Like 5 Dislike
2020-12-11 02:33:41
int 一個array[500]輸入嘅數字有空白鍵隔開。有個位數雙位數同百位數,點可以分割到啲數字。每個數字之間有空白鍵隔開。條程式應該點寫。求高人指教
2020-12-11 06:00:23
咁樣 ?
#include <stdio.h>

int main()
{
int a, b;
const char* str = "10 555";
int ret = sscanf(str, "%d %d", &a, &b);
if (ret != 2) {
printf("error read");
return -1;
}

printf("a=%d b=%d", a, b);
return 0;
}
2020-12-11 06:21:49
By default arduino 應該冇libc? 所以冇studio.h 畀你include

樓主可以如果唔識用Serial.read() 睇吓呢個post
https://forum.arduino.cc/index.php?topic=217797.0

你要做嘅嘢都read 完返黎做簡單string parsing,我唔畀code la, 自己諗點寫
個flow 只係係郁index/pointer 去拎個char, assume input 係ascii, 又得0 至9 同 space, 拎咗嗰char 返黎睇吓係唔係 space 或啫已經拎哂,係就submit 之前計緊嗰數入array, 同埋將嗰個數reset,

如果只係0-9 就 covert ascii value actual integer ( ch - '0'),將計緊嘅乘10 再+= 啱啱convert 返返嗰個integer
2020-12-11 13:43:20
好奇問吓arduino有無emulator?
2020-12-11 14:50:03
有空格就唔係數字
2020-12-11 14:50:29
tinkercad
2020-12-11 16:09:46
我想問點先可以分割啲數字。例如 1 2 22 222 33 44咁。中間有空白鍵。用char input[]好似唔識分因為最後還有一部要比較數字嘅大小
2020-12-11 16:10:50
Arduino 語言應該唔係咁⋯⋯😹
2020-12-11 16:24:13
int number[5];
int input[500];
int i = 0;
int v = 0;
int a = 0;
int value;
void setup() {
Serial.begin(115200);
Serial.println(" Please input ");
while (Serial.read() >= 0) {} //clear serialport
}

void loop() {
while(Serial.available() > 0) {
for(i=0;i<4;i++){
number[i] = Serial.read();
if(number[i] == 32){
switch(i){
case 1:
value = number[i-1]-48;//Enter as single digit
break;
case 2:
value = ((number[i-2]-48)*10) + (number[i-1]-48); //Enter as double digit
break;
case 3:
value = ((number[i-3]-48)*100)+((number[i-2]-48) *10)+(number[i-1]-48);//Enter as hundreds
break;
}
input[v]=value;
v++;
}

}
Serial.print(input[0]);
for(int c=0;c<v;c++){
input[c]= '\0';
}
}
}
最後寫成咁 但每次print 都會print 返上次啲野 而且好似入唔到第二個數落input【v】入邊。
2020-12-11 16:53:21
唔係 C/C++ 咩 ?
Arduino 有自己語言 ?
2020-12-11 16:55:42
佢有自己一個lib
不過無論點寫micro controller 都幾乎唔會用到stdio.h
2020-12-11 16:55:49
係C/C++
但佢無stdio嘛
呢啲microcontroller有自己一套IO library
2020-12-11 16:58:52
我明白係無 stdio.h 既意思
只係以為唔係 C/C++, 因為好多年無玩過, 以前都係用 C
2020-12-11 17:03:55
係咪assignment 嚟

其實你唔駛轉char 用mod operator 就得
當個數係x as integer
你可以將成個數:
x % 10 --> 個位數
(x/10) % 10 --> 十位
(x/100) % 10 --> 百位(其實呢個連mod 都未必駛)

點樣print 出嚟唔駛講啩
2020-12-11 20:36:06
你寫錯嘢喎,你而家只會read 倒4個bytes (因為Serial.read() 係 loop function 只係call 咗4次)

如果serial input 係”123 “ ,你input array 會係[1, 12, 123]...

同埋而家只係print input[0], 即係第一個digit

諗請楚啲你想寫乜logic

你應該read 哂成行input 入黎先,再一格格睇睇佢係數字定空白,嗰logic 好似我之前嗰post 咁講
2020-12-11 20:38:11
佢要做read 唔係做print , 同埋Serial.print() 係識正常咁print integer, 唔洗一個一個digit char 咁print
2020-12-11 21:11:36
我直頭誤會咗以為要print 數字之間要有空格

自膠咗
2020-12-11 21:41:32
我下面係想print 個[0]睇下入邊係咩。
你意思係read曬再分?
直接input = Serial.read咁入曬先?
再從input入邊分出數字存入去個array?
2020-12-11 21:44:20
係啊。咩係operator 老師講我啲程式語言都係自己學返來個阿sir放條題目就叫自己試。我開頭望住 setup。loop兩粒字大半日都唔知要點入手做
2020-12-11 23:01:34
你都可以一路read 一路parse 嘅,咁會用少啲ram tim

基本想你會想寫嗰while loop instead of for loop, read 到 冇嘢read (return -1) 或者可能係睇倒new line character 為止

如果read 倒嘅係數字,就keep 住accumulate 嗰value ( accumulated value * 10 + current digit value), 如果read 倒係空白間就放嗰accumulated value 入array, 再reset ,返嗰accumulated value 做0
2020-12-11 23:07:45
Operator 即係 + - * / 呢啲,% 就係用黎計餘數嘅operator, 即係7 % 3 等於 1, 因為7除以3 ,餘數係1
2021-01-01 11:32:27
https://www.arduino.cc/reference/en/language/functions/communication/serial/parseint/

比個提示你:
int arr[500] = {0}; for(int i = 0;i < 500; i++){ arr[i] = Serlal.parseInt(); }
2021-01-01 11:38:56
while(1)
{
int x = Serial.parseInt();
}

係arduino include stdio做乜勁
有library做parse integer點解要用read()再自己parse character
同埋就算係都用 String 同 Serial.read() 然後 .toInt()
2021-01-01 11:55:41
ATMega328P 得2Kbyte RAM
你開一個 int arr[500] 一Q清袋
吹水台自選台熱 門最 新手機台時事台政事台World體育台娛樂台動漫台Apps台遊戲台影視台講故台健康台感情台家庭台潮流台美容台上班台財經台房屋台飲食台旅遊台學術台校園台汽車台音樂台創意台硬件台電器台攝影台玩具台寵物台軟件台活動台電訊台直播台站務台黑 洞