看板 ASM 關於我們 聯絡資訊
我最近正在做RS232與89S51的相關傳輸。 我想請問一下 我在發送端 丟一個字串 過去 給89S51 然後89S51 再傳回給我PC ㄧ個字串(程式內這樣設定的... 可是 我在PC的回傳值顯示上看到卻是 31 13 10(hex) 49 D A(10) 為何傳回值是 3 個字元 是因為他協定的關係嗎? 那我實際上傳給89S51我的傳送也都會附加 'D' 'A' 這2個字元嗎? 我丟的是字串才對 而回傳的也是字串(puts("1")); 太久沒摸C = =|| 可是又多了一個問題如果我使用 puts('1'); 我只接收到 D A ???? 網路的RS232文獻都沒有相關說明! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.33.51.36
hayden0828:電腦端用什麼程式??會不會是'CR'跟'LF'換行字元 09/24 06:29
ruemann:同意樓上,應該是你送了三個字元過去 09/24 10:36
laevatain103:sorry..我打錯...那應該是10進位制而非ASCII... 09/24 11:03
※ 編輯: laevatain103 來自: 114.33.51.36 (09/24 11:04) ※ 編輯: laevatain103 來自: 114.33.51.36 (09/24 11:05)
laevatain103:我之前有查過ascii碼 D A 的確是CR LF 這協定內定的? 09/24 11:06
ruemann:你Windows程式的問題,把換行給送出去了 09/24 12:18
laevatain103:那傳回的值應該是ㄧ個字元才對(51寫死的... 09/24 12:33
※ 編輯: laevatain103 來自: 140.128.142.122 (09/24 13:47)
ruemann:你直接把TX和RX對接,這樣你windows程式送啥就會收到啥 09/24 18:50
ruemann:先確認windows程式可以送一個字元後再接回8051看結果 09/24 18:51
laevatain103:直接拿線來接嗎?= =|| 感覺蠻刺激的 09/24 23:02
ruemann:RS232對接測試很正常啊…… 09/25 02:24
我做了對接後發現並無有 CR LF 我做了一些簡單的測試 8051(CODE) PC(接收資料顯示以10進位表示) puts("1"); 49 13 10 puts('2'); 13 10 printf("3"); 51 printf('4'); link: http://imgur.com/1NPcz (有圖有真相) 從以上來推測 應該是 puts(); 此函數所自動附加的! ※ 編輯: laevatain103 來自: 114.33.51.36 (09/30 20:44) ※ 編輯: laevatain103 來自: 114.33.51.36 (09/30 20:45)
ruemann:最好是可以並個示波器看波型最準 09/30 23:55
ruemann:puts這個函式如果不是你寫的,最好去查一下用法 09/30 23:55
laevatain103:puts() 是內建的~我正在找相關文件= = 10/01 00:19
我在C51 compiler的文件中找到 int puts (const char *string); Description: The puts function writes string followed by a newline character (‘\n’) to the output stream using the putchar function. ※ 編輯: laevatain103 來自: 114.33.51.36 (10/01 00:35)
laevatain103:以上只能解釋為什麼有LF..我現在還找不到未啥有CR 10/01 00:58
WolfLord:一般M$系統字串'\n'就是解釋為"\n\r"而UNIX上才是只有\n 10/01 01:37
WolfLord:Keil C裡面的內定putchar採用的是看到\n就自動加上\r 10/01 01:38
WolfLord:而標準的C函式中puts 是會自動加上\n的,而puts一般都是 10/01 01:39
WolfLord:透過 putchar來傳送文字的。所以你的問題是由puts跟putch 10/01 01:39
WolfLord:ar 兩個函式合力構成的,要修正這個問題可以到C51的LIB 10/01 01:41
WolfLord:目錄中把putchar.c拿出來改 10/01 01:42
ruemann:樓上高手 10/01 01:50
感謝樓上大大門~真是讓我受益良多! 應該是 \r\n 而不是 \n\r 相信你一定手誤了吧XD New line, UNIX中代表ASCII 10(十進位), DOS(Windows)系統中則是ASCII 13 + ASCII 10(十進位). 參考 link: http://ind.ntou.edu.tw/~dada/cgi/Perlsynx.htm (使用搜尋關鍵字UNIX會把較容易找到) ※ 編輯: laevatain103 來自: 114.33.51.36 (10/01 02:22) ※ 編輯: laevatain103 來自: 114.33.51.36 (10/01 02:24)