DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: deliping
今日帖子: 0
在线用户: 8
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 10:41:23
标题:
请教一个和单片机连接串口传输数据的问题。 浏览:3669
加入我的收藏
楼主: 日前想用做DELPHI做一个跟数据采集卡(单片机)串口数据传输的程序,用SPCOMM控件通信,遇到了两个问题,还望大家赐教。
第一,传输数据的类型问题,我在程序中是直接发送的string类型的数据,但是数据采集卡接受到的是ascii码,或者是其他什么码,反正接收不到正常的数据。
第二,使用第三者开发的串口调试程序,通过16进制发送的时候,单片机可以正常接收数据,但是单片机发送的数据的时,串口调试程序如果设定为ASCII码时,无法接收数据,或者接收的数据无法显示。如果设为16进制接收的话,接收后显示的数据有误差。


----------------------------------------------
-
作者:
男 yuku11 (yuku11) ★☆☆☆☆ -
普通会员
2004/2/5 10:59:13
1楼: 不懂。。我来顶,学习,学习。
呵呵~~一点想法。单片机接收什么类型的数据你就转成什么数据发给它.
----------------------------------------------
-
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2004/2/5 11:04:00
2楼: 学习
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 11:25:13
3楼: 理论上来讲,我发送的是字符转成的ASCII码,可是因为我用的是SPCOMM,所以从串口发送的具体是什么类型,我也不清楚,但是单片机好像只认识十六进制的数,但我不清楚,我怎样才能把发送的数据改为十六进制。还有就是单片机发送的数据我用SPCOMM接收不到,或者说是接收到了但是不能正常显示,头痛呀。
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 11:38:21
4楼: 我急用,在线等,哪位兄弟知道拜托告诉我一声。
----------------------------------------------
-
作者:
女 haikely (阿) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 11:43:32
4楼: 串口只能认得ASCII码。所以你必须把String类型转成ASCII码.
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 14:56:40
5楼: 如果串口只认识ASCII码的话,是不是单片机也必须得用ASCII传输数据?
但是SPCOMM控件好象已经把STRING类型的数据转成ASCII码了呀。
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 15:49:37
6楼: 急呀顶。
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 16:10:40
7楼: 说清楚一点嘛,你送给单片机的串,在PC这边的是什么样的串列出一个来;
单片机要的是什么样的数据,也要说明白一点.
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 16:29:47
8楼: 给你两个例子帮我分析一下

采用ASCII码发送时
PC发送:      00 01 02 03 04 05
单片机接收为  70 71 72 73 74 75

采用码ASCII接收时:
PC能够接收到单片机发送的字节,但是无法显示。我用的TMEMO显示接收内容


采用16进制发送时:
单片机可以正常接收到PC发送的数据。

采用16进制接收时:
单片机发送:      00 01 02 03 04 05
PC接收为:        80 81 82 83 84 85
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 16:36:33
9楼: 看样子,象是PC与单片机串口设置的不一样,如数据位长度,停止位,校验等.
波特率象是一样的.
还有一点: 你上面所说的是现象, 还是应该 ? 

在TMemo里请把接收到的按每字节转成两位十六进制串显示.
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 16:38:17
10楼: 呵,谢谢你提醒了我。

可我不知道怎么把字节转成两位十六进制串,麻烦相告一下。
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 16:41:35
11楼: 但是数据位长度,停止位,校验位设置都是相同的呀。
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 16:43:19
12楼: IntToHex(ord( ),2)+' '
----------------------------------------------
-
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2004/2/5 16:43:39
11楼: 先求没个字节的ASI码
而后inttohex函数转成十六进制字符串
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 16:51:21
13楼: to 楼主:
在startcomm之前加上下面的几条,(只有一条真正有用,是哪条,我不知,呵呵)
  with COMM1 do begin
      Outx_CtsFlow:=False;
      Outx_DsrFlow:=False;
      DtrControl:=DtrEnable;
      DsrSensitivity:=False;
      TxContinueOnXoff:=False ;
      Outx_XonXoffFlow:=False;
      Inx_XonXoffFlow:=False; 
   end;

----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 16:52:04
13楼: 12楼: IntToHex(ord( ),2)+' '  
最后的' '是什么意思?
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 16:54:26
14楼: 连成一大片字符,不好看的. 所以用空格隔开.
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 17:03:49
15楼: 十万分地感谢bjdribllec和bios可
DtrControl:=DtrEnable;这一条是什么意思呢?

----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 17:11:12
16楼: 现在又遇到了新的问题

采用16进制接收时:
单片机发送:      30 31 32 33 34 35/
PC接收为:        90 B1 92 B3 B4 95


 

----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 17:12:42
16楼: 能编译您就用着,真的,我也不知道是什么意思,需要问small pig组.
通讯成了的话,在这里告诉一声. 别忘了哟!
----------------------------------------------
-
作者:
男 niat_zxz (独孤诗魔) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 17:13:55
15楼: 不知道是不是你的波特率没设对,
我一同学做毕设时也遇到同样的问题,改了波特率就好了
----------------------------------------------
还是很菜,继续努力!
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 17:15:00
17楼:  COMM1.Parity
 COMM1.ParityCheck
 这两项您是怎么设的?
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 17:20:43
18楼: COMM1.Parity:=none;
 COMM1.ParityCheck:=false;
另外
IntToHex(ord( ),2)+' '  
中的ord()是什么意思?里面的数据类型应该是什么?
还有随便问一下char()的功能是什么?里面的数据类型应该是什么?

通讯成了,我一定把源码奉上。


----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 17:23:09
19楼: 采用16进制接收时:
单片机发送:      30 31 32 33 34 35/
PC接收为:        90 B1 92 B3 B4 95


这又是什么原因造成的呢?
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 17:28:51
20楼: ord(Buffer^) 是个字节呀.
不看源码也成, 我这PC上的,51上的都有.呵呵, 只是关心是否调通了.
for 19楼, 您加了13楼的代码了?
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 17:32:23
21楼: byte类型的可以加吗在ord()吗?
我还没有加上那个代码。因为有错误。让你看一下这一段代码:
procedure TFormCommTest.Comm2ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
type
    IArr = ^integer;
  var
    RevP : array [1..4096] of byte;
    i : integer;
    CommRevStr : ShortString;
begin
  SetLength(CommRevStr,BufferLength);
  Move(IArr(buffer)^,Revp,bufferLength);
  For i:=1 to BufferLength do
    begin
     CommrevStr[i] :=char(inttohex(ord(Revp[i]),2)+' ');
    end;
  Memo2.Lines.Add(CommrevStr);
  StatusBar1.Panels[2].Text := '串口2正在接收数据';
end;

提示这一句有错误,可我不知该怎么 写了。
 CommrevStr[i] :=char(inttohex(ord(Revp[i]),2)+' ');


----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 17:52:30
22楼: 还有,char()的功能是什么?里面的数据类型是什么?
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 17:58:23
23楼: 已经是byte了,就不用ord了

   CommrevStr:string;

   CommrevStr:=';
   For i:=1 to BufferLength do
    begin
     CommrevStr:=CommrevStr+inttohex(ord(Buffer^),2)+' ';
     inc(Buffer);
    end;
  Memo2.Lines.Add(CommrevStr);
  StatusBar1.Panels[2].Text := '串口2正在接收数据';
end;

----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 18:14:36
24楼: 数据不可兼容。
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/5 18:21:17
25楼: CommrevStr:=CommrevStr+inttohex(ord(Buffer^),2)+' ';
这一句提示有错误。
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/2/5 18:22:49
25楼: 怪我!

   P:PChar;
   CommrevStr:string;

   P:=Buffer;
   CommrevStr:=';
   For i:=1 to BufferLength do
    begin
     CommrevStr:=CommrevStr+inttohex(ord(P^),2)+' ';
     inc(P);
    end;
  Memo2.Lines.Add(CommrevStr);
  StatusBar1.Panels[2].Text := '串口2正在接收数据';
end;

----- 
so long. :)


----------------------------------------------
-
作者:
男 skertone (奇奇怪) ★☆☆☆☆ -
盒子活跃会员
2004/2/6 10:10:16
26楼: 一般串行通信都是使用 ASCII 码的,

但是要看你们是用几根线的 3根还是9根?

如果是9线的可能需要打工 组件的 DTR 与RTS 控制

否则可能收到不数据,或数据变形

波特率不匹配常导致乱码

建议找个好个的串口调试工具来测试一下 这样就可以分清问题出在硬件还是软件

推荐 sscom32 (C++Bulider写的) 这个工具非常不错



此帖子包含附件:skertone_200426101016.rar 大小:319.4K
----------------------------------------------
按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/6 10:26:02
27楼: 感谢,我调试以后,和以前的效果是一样的。也就是


采用ASCII码发送时
PC发送:      00 01 02 03 04 05
单片机接收为  70 71 72 73 74 75

采用码ASCII接收时:
PC能够接收到单片机发送的字节,但是无法显示。我用的TMEMO显示接收内容


采用16进制发送时:
单片机可以正常接收到PC发送的数据。

采用16进制接收时:
单片机发送:      00 01 02 03 04 05
PC接收为:        80 81 82 83 84 85 


----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/6 10:52:48
28楼: 帮我看一下这段代码有什么问题。 

var
    p:pchar;
    //RevP : array [1..4096] of byte;
    i : integer;
    s : byte;
    CommRevStr : String;
begin
     p:=buffer;
     //Move(IArr(buffer)^,Revp,bufferLength);
    CommrevStr:=';
   For i:=1 to BufferLength do
    begin
     s:=ord(p^);
     CommrevStr:=CommrevStr+inttostr(s)+' ';
     inc(p);
    end;
  Memo2.Lines.Add(CommrevStr);
  StatusBar1.Panels[2].Text := '串口2正在接收数据'; 
----------------------------------------------


----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/6 11:06:38
29楼:  bjdribllec 老兄
你的代码帮了大忙了,现在已经可以用半个字节通信,但是如果发送的数据是一个字节的话,接收就不正常了。

比如单片机发送的是1F,PC接收为190
----------------------------------------------
-
作者:
男 wanglei916 (rock) ★☆☆☆☆ -
普通会员
2004/2/9 9:47:55
30楼: 现在已经可以进行通信了,呵呵,高兴呀。只是还有一个问题没有解决,说给大家听听。

可能是数据缓冲区的问题,我每次接收完一组数据,然后再重新发送的时候,第一次发送的总是最后接收到的数据,晕呀,是程序的问题,还是应该在接收完数据以后将缓冲区清0呢?
----------------------------------------------
-
作者:
男 zzacomp (zzacomp) ★☆☆☆☆ -
普通会员
2004/2/17 10:23:25
31楼: 请教wanglei916 ,你的以下问题是如何解决的?谢谢! 
     采用16进制接收时:
      单片机发送:      00 01 02 03 04 05
      PC接收为:        80 81 82 83 84 85 


----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行95.00122毫秒 RSS