求大神幫解~急
本帖最后由 s930427 于 2016-5-30 15:11 编辑目前要用arduino經由tx rx傳送封包,按照封包格式傳送,單接收結果為完全不同,求大神幫忙
圖為封包格式
希望與此圖上半部一樣的訊號,但是ARDINO卻是下半部的那樣。
/* program design by Edy TSAI*/
/* KEB company
/* NOTE 使用 Serail.print表示 寫入 ; 先選通道 為 Serial 或是Serial1-3,print(這裡放value,格式 (ex: bin or hex )) */
#include <UTFT.h>
#include <Wire.h>
UTFT myGLCD(HX8357B, 38, 39, 40, 41);
extern uint8_t BigFont[];
extern uint8_t SmallFont[];
char buf;
byte R;
byte A;
void setup() {
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setFont(BigFont);
myGLCD.setColor(255, 255, 255); //BLACK
Serial.begin(38400);
//Serial.begin(4800, SERIAL_7E1);
Serial3.begin(38400);
Wire.begin();
//Serial3.begin(38400, SERIAL_7E1);
}
void loop() {
// Serial.print(48, HEX);
myGLCD.print("R & W", CENTER, CENTER);
//READp();
writep();
//Serial.end();
//Serial3.end();
}
void serial()
{
R = Serial.available();
myGLCD.printNumI(R , 0, 0);
if (Serial.available())
{
Serial.readBytes(A, 13);
if (A == 48) {
Serial.println("LOGIN ACESS !");//密碼 0009 回傳 ,9 IN ASII =57
}
for (int i = 0; i < 13; i++)
{
Serial.print(A); // 回傳給 serial 收到的資料
Serial3.print(A); // 並傳到 serial 3
myGLCD.print("SERIAL READ ", 50, 0);
myGLCD.printNumI(A , i * 35, 30);
delay(100);
}
}
}
////////////////////////////////////////////////////////////////////////////////////
void READp()
{
// EOT = 04h ENQ = 05h STX = 02h ETX = 03h ACK = 06h NAK = 15h
// 48, 44, 30, 33, 30, 33, 30, 30, 05, 29 測試用 封包 16進制
//byte request = {48, 44, 30, 33, 30, 33, 30, 30, 05, 29};
byte request = {72, 68, 48, 51, 48, 51, 48, 48, 05, 41}; //宣告 request 封包 大小為 10 bytes請注意 輸入 真值
Serial3.write(request, 10); // send requestthrough Serial3note write send binary data to serial port
byte Response;
Serial3.readBytes(Response, 13);
for (int j = 0; j < 13; j++) {
myGLCD.printNumI(Response, 0, j * 20);
//myGLCD.print(itoa(Response, buf, 16) , 50, j *20);
}
}
//////////////////////////////////////////////////////////////////
void writep()
{
/* _____________________________________________________________
*封包格式 EOT01 | STX | H/G |IID | address | data 8|SET | ETX | BCC|
| 02h | 'H' | '2'| 4byte | 8byte |'0''1'| 03h | >1Fh |
*/
// | | | STX| || | | | | |
byte wrequest={30, 34, 30, 31, 30, 32, 34,38, 32, 30, 31, 32, 34, 33, 17, 17, 17, 17, 17, 17, 17, 31, 17, 17, 17, 33, 45}; //HEX
//byte wrequest[] = {0x04, '0', '1', 0x02, 'H', '4', '0', '1', '2', 'C', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', 0x03, 0x28};
//byte wrequest={04, 48, 49, 50, 72, 54, 48, 49, 50, 67, 48, 48, 48, 48, 48, 48, 48, 49, 48, 48, 48, 03, 35};//DEC Warr
//Serial3.write(wrequest, 19); // send requestthrough Serial3note write send binary data to serial port
for (int a = 0; a < 27; a++)
{
sendbyte(wrequest);
//delay(2/10);
}
//Serial.write(ss);
delay(1000);
Serial.write(wrequest, 27);
// delay(50);
//Serial3.write(0); // 回傳ERROR封包 為 80 (HEX)
//Serial3.write(1); // 不回傳 不顯示
//byte A={1,0};
//={0,0}; //0! ReceiveErrorBCC RAW 回傳ERROR封包 為 80 (HEX)
//Serial3.write(A,2);
//Serial3.print(0);//70 //key 0 get 40 回應 /key 1 | 2no responsekey 00 顯示 1f 回應 40
//Serial3.print(1);//7C
//byte wrequest2={1,1};
//Serial3.write(wrequest,19);
//Serial.write(wrequest,19); // arduino
//Serial3.print(1);
for (int j = 0; j < 14; j++) {
myGLCD.printNumI(wrequest , j * 35, 0);
myGLCD.print(itoa(wrequest, buf, 16) , j * 35, 20);
}
}
/* below is result at protocol monitor
0 6F 1F 19 1F 19 1F 1F 1F 1F 1F 1F 1F 1F 1F 79 0F oy
1 76 6F 1F 19 1F 19 1F 1F 1F 1F 1F 1F 1F 1F 1F 79 0Fvoy
Serial.begin() - 開啟 Serial Port 並設定通訊速率 (baud rate)
Serial.println() - 傳送資料到外部電腦
Serial.read() - 接收來自外部電腦的資料
Serial.available() - 取得 Serial Port 可讀取的資料位元組數目 (number of bytes),如果 Serial port 有資料進來,Serial.available() 會回傳大於 0 的數值。
Serial.read() - 讀取進來的第一個位元組 (first incoming byte)。
*/
/*//仿c的printf
/*void pf(const char *fmt, ... ){
char tmp; // resulting string limited to 128 chars
va_list args;
va_start (args, fmt );
vsnprintf(tmp, 128, fmt, args);
va_end (args);
Serial.print(tmp);
}*/
void sendbyte(char val)
{
Serial.print(val);
delay(1/10);
}
void sendstring(char *val)
{
while (*val != '\0')
{
sendbyte(*val++);
}
}
咁長無認真睇, 只係見到 sendbyte 入面果句, 應該好大問題:
Serial.print(val);
做呢類通訊, 一定係用 write, 唔會用 print. Sorry, 你又好似係用
Serial.write(wrequest, 27);
睇漏左....
真係太長, 仲好多 comment, 好難睇. "按照封包格式傳送,單接收結果為完全不同"
或者會唔會講清楚, 你話有問題既, 係發出既資料定係回傳既資料?
程式之中只可以猜想發出的資料, 如果問題是回傳的資料, 在 程式中不能看到吧.
另外, 當中一句: delay(1/10);
delay 的 parameter 是 unsinged long, 是整數值的, 1/10 就變成 0 了.如果想 delay 0.1 ms, 要用 delayMicroseconds(100)
Super169 发表于 2016-5-30 16:41 static/image/common/back.gif
"按照封包格式傳送,單接收結果為完全不同"
或者會唔會講清楚, 你話有問題既, 係發出既資料定係回傳既資料 ...
抱歉,是我沒打清楚,
我讓封包發出去,另外在用軟體監測送出去的封包。
問題是我發出去的封包,用監測軟體查看時,卻有問題!
嘗試粗略跟你的程式行一次,
loop()->writep()->sendbyte()->Serial.print
在 writep 中把 wrequest 的資料一個個送出.
初時無留意, 你係用 char 去 print, arduino 入面 print(char c) 係直接 call 番 write(c);
所以呢度用 print 都唔應該有問題.
而你之後就係Serial.write(wrequest, 27);
應該係同上面一樣, 跟 wrequest 既 27 個 bytes 送出.
你講有問題既, 係邊個 output 有問題.
你收到 00 F8 F8 F8 80 .... ?
或者可以先測試一下連線, 做個最簡單的程式, 只在 setup 中 送出幾個 Serial.write, 看看接收是否正確.
如果這樣也不正確, 就可能是 serial 連線的設定上有問題了.
Super169 发表于 2016-5-30 18:08
嘗試粗略跟你的程式行一次,
loop()->writep()->sendbyte()->Serial.print
是的,的確會收到00 F8
是型態問題嗎?
試過用print(v,HEX);
也是不得解。 你的程式中:
byte wrequest={30, 34, 30, 31, 30, 32, 34,38, 32, 30, 31, 32, 34, 33, 17, 17, 17, 17, 17, 17, 17, 31, 17, 17, 17, 33, 45}; //HEX
這樣只會設定成 dec 而唔係 hex.
理論上應該會發出1E 22 1E 1F .....
就算用左 print, 當 int 出, 你都應該係收到 33 30 33 34 .....
你接收到既比較奇怪.所以有點懷疑係連線上既設定有問題.
你先試試不用你的 program, 簡單在 setup 入面, Serial.begin之後,只加上 Serial.write(0x30); 就完結.
看看是否可以收到 30.
通訊程式要除蟲時, 第一件事必要確保通訊本身是沒有問題, 否則, 接收到的東西就不可靠了.
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定. Super169 发表于 2016-5-30 22:36 static/image/common/back.gif
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.
34800bps是相同設定,至於發送是dec,hex都有試過,卻還是有問題
另外則是一直覺得是監測封包軟體的關西,因為這程式是要模仿上半部的那種訊號,但卻一直有問題
感謝您回復。 Super169 发表于 2016-5-30 22:36 static/image/common/back.gif
arduino 的 serial 連線, 預設是 N81, 而你用的是 38400bps, 請先確認接收端是用了相同的設定.
資料接收是設8位元,就能正常顯示。
那我如果要他是7位元,能夠這樣設嗎? s930427 发表于 2016-5-31 08:48 static/image/common/back.gif
資料接收是設8位元,就能正常顯示。
那我如果要他是7位元,能夠這樣設嗎?
Serial.begin 除了可設定 baud rate外, 還可以接受一些預設的 config.Syntax:Serial.begin(speed, config)
詳情可參考: https://www.arduino.cc/en/Serial/Begin
如果你要用 N71 (no parity, 7 bit data, 1 bit stop), 可以改成
Serial.begin(38400, SERIAL_7N1);
兩個 Serial 怎樣分配?
另注意這一句中的轉換問題: Serial.readBytes(A,13); Super169 发表于 2016-5-31 09:44 static/image/common/back.gif
Serial.begin 除了可設定 baud rate外, 還可以接受一些預設的 config.Syntax:Serial.begin(speed,...
感謝大大。
後來改用Serial.begin(38400, SERIAL_7N1);做輸出
但是收到的數值更糟糕,剩下一個值
是因為我用7bit輸出,所以資料陣列的資料型態又錯嗎?
页:
[1]
2