ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2013年8月19日月曜日

ZigbeeモージュールTWE-LiteとProcessingでシリアル通信

ZigbeeモージュールTWE-Liteでシリアル通信のテストをしました.
PC-USBシリアルモジュール-TWE-Lite
USBシリアルモジュールのTX,RXとTWE-LiteのTX,RXをクロスして接続する.
親機:M1-GND,M2,M3オープン,BPS-GND(38400bps)
子機:M1,M2,M3オープン,BPS-GND(38400bps)
まずは,teratermでテスト.
通信速度を38400にして,TerminalのTransmitをCR+LFとしておく.
親機 (論理ID=0x00) ,子機 (論理ID=0x78)双方から約1秒間隔で,
以下のようなIO状態の通知データが送られる.
:7881150175810000380026C9000C04220000FFFFFFFFFFA7

親機からデータを送ってみる.
下記データをコピーしteratermに張り付け,Enterすれば,
子機側のPCのteraterm上に表示される.
:780100112233AABBCCDD13
最後の2バイトはチェックサムで,0x78+0x01+0x00+...0x13の下位が0x00になる.

続いてProcessingで作ったシリアル通信のテストプログラム
親機側からhello!を2秒間隔で送信する.
子機では,IO状態の通知データは無視しそれ以外のデータを表示する.

親機側の送信プログラム
import processing.serial.*;
Serial myPort;
void setup(){
myPort = new Serial( this, Serial.list()[0], 38400);
}
void draw(){
char[] data= new char[20];
int i,sum,n=7;//N of words +1
data[0] =0x78;
data[1] ='h';
data[2] ='e';
data[3] ='l';
data[4] ='l';
data[5] ='o';
data[6] ='!';
String str = ":";
  sum=0;
  for(i=0;i<n;i++)sum+=(int)(data[i]);
 data[n]=(char)((256-sum%256)%256);

for(i=0;i<=n;i++){
  if(data[i]/16>9)str+=(char)('A'+(data[i]/16-10));
    else str+=(char)('0'+(data[i]/16));
  if(data[i]%16>9)str+=(char)('A'+(data[i]%16-10));
    else str+=(char)('0'+(data[i]%16));
  }
println(str);  
str+='\r';  //CR
str+='\n';  //LF
myPort.write(str);

//delay 2 sec
int t=millis();
  while(millis()<t+2000){}

}//draw()


子機側の送信プログラム
import processing.serial.*;
Serial myPort;
void setup(){
  size(100,100);
myPort = new Serial( this, Serial.list()[0], 38400);
}
void draw(){
  int i,n;
  char a;
  char[] data = new char[100];
    String str = "";

for(i=0;i<100;i++){
  while (myPort.available()==0){};
    data[i]=(char)myPort.read();
    str+=data[i];
    if(data[i]=='\n')break;
}//for
n=i;  //50
if(n!=50)for(i=3;i<n-4;i+=2){
  if(data[i]>='A')a=(char)(10+data[i]-'A');
  else a=(char)(data[i]-'0');
  a*=16;
  if(data[i+1]>='A')a+=(char)(10+data[i+1]-'A');
  else a+=(char)(data[i+1]-'0');
  print(a);}
}//draw()