8

シリアル通信を使用して、整数、たとえば0〜10000をArduinoに送信する必要があります。それを行うための最良の方法は何ですか?

数値を文字配列(たとえば、500を「5」、「0」、「0」)に分割し、それらをバイトストリームとして送信することを考えることができます(ええ、それは醜いです)。次に、もう一方の端で再構築します。(何かがバイトストリームとしてシリアルに送信されますよね?)

もっと良い方法はありませんか?intどういうわけか、値を型変数に割り当てることができるはずです。

(可能であれば、文字列についても同じことを知っておく必要があります)

4

5 に答える 5

9

探しているのが速度である場合、ASCIIでエンコードされたintを送信する代わりに、数値を2バイトに分割できます。例を次に示します。

uint16_t number = 5703;               // 0001 0110 0100 0111
uint16_t mask   = B11111111;          // 0000 0000 1111 1111
uint8_t first_half   = number >> 8;   // >>>> >>>> 0001 0110
uint8_t sencond_half = number & mask; // ____ ____ 0100 0111
    
Serial.write(first_half);
Serial.write(sencond_half);
于 2012-12-17T01:16:21.997 に答える
3

from環境を指定していないので、Arduinoでシリアルデータを読み取るのが問題だと思いますか?

とにかく、 Arduinoシリアルリファレンスに見られるように、Serial.parseInt()メソッド呼び出しを使用して整数を読み取ることができます。あなたは例えばで文字列を読むことができます。Serial.readBytes(buffer, length)しかし、あなたの本当の問題は、いつ文字列を期待するのか、いつ整数を期待するのかを知ることです(そして、ノイズなど、何か他のものが発生した場合にどうするか...)

于 2012-12-14T10:00:11.053 に答える
3

別の方法:

unsigned int number = 0x4142; //ASCII characters 'AB';
char *p;
    
p = (char*) &number;
    
Serial.write(p,2);

コンソールに「BA」を返します(LSBファースト)。

于 2014-11-27T21:12:17.217 に答える
1

他の方法:

char p[2];
*p = 0x4142; //ASCII characters 'AB'
Serial.write(p,2);

私はこのように好きです。

于 2016-05-04T22:02:31.140 に答える
0

私はコーディングのバックグラウンドを持っていません。今日は同じことを試し、それを機能させました。開始バイトと終了バイト('a'と'b')を追加して、バイト単位で数値を送信しています。それが役に立てば幸い..enter code here

//sending end
unsigned char a,n[4],b;
int mynum=1023;// the integer i am sending
for(i=0;i<4;i++)
{
    n[i]='0'+mynum%10; // extract digit and store it as char
    mynum=mynum/10;
}

SendByteSerially(a);
_delay_ms(5);
SendByteSerially(n[3]);
_delay_ms(5);
SendByteSerially(n[2]);
_delay_ms(5);
SendByteSerially(n[1]);
_delay_ms(5);
SendByteSerially(n[0]);
_delay_ms(5);
SendByteSerially(b);
_delay_ms(100);


//at receiving end. 
while(portOne.available() > 0) 
{
    char inByte = portOne.read();
    if(inByte!='a' && inByte !='b')
    {
    Serial.print(inByte);
    }
    else if(inByte ='a')
        Serial.println();
    else if(inByte ='b')
        Serial.flush();
    }
delay(100);
于 2015-01-29T15:51:07.910 に答える