单片机通过串口发送12位的十六进制数据,先发高4位,后发低8位,用C#做了一个串口,用于接收数据

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-25
C# 串口通信 高低字节合并是怎么回事啊

一般情况下单片机有8位单片,16位单片以及32位单片机。一般情况下对于8位单片的比较多,比如51单片机。所谓的8位单片,就是因单片机系中最大的寄存器为8位,当其想表示一个16bits的数时,必须发送过来两个数字,就是把16bits的数分成两个8bits时向上位机发送,换句话来说,你的8位单片机,每次只能给你发一个8bits的字节,而它要表示一个数据必须使用16bits编码时,其实需要两次发送,也就是你所说的两个字节。

但事实你必须要知道的是这两个字节是不可分的,只有这两个8bits才能表示一个完整意义。而计算机对于16bits,32bits等处理是绰绰有余的,所以计算在接收这两个数字之间必须将其合并成一个,当然单片机也有发送顺序,先发送高位,再发送低位。这时你需要将这两个得新组合。

定义一个smallint类型,接收第一个字节,并将其向左移8位,实际上是乘256也是一样的,但可能会溢出。然后再通过字节的OR操作与后一个字节,和出的结果就是合并后的结果。


从原理与算法上我感觉你应该明白高低字节合并,和为什么会出现高低字节合并了!

串口主要有以下几个参数:
1.串口名称(PortName)
2.波特率(BaudRate)
3.数据位(DataBits)
4.奇偶效应(Parity)
5.停止位(StopBits)

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows;
6 using System.Windows.Controls;
7 using System.Windows.Data;
8 using System.Windows.Documents;
9 using System.Windows.Input;
10 using System.Windows.Media;
11 using System.Windows.Media.Imaging;
12 using System.Windows.Navigation;
13 using System.Windows.Shapes;
14 using System.IO.Ports;
15
16 namespace CsharpComm
17 {
18 ///
19 /// Window1.xaml 的交互逻辑
20 ///
21 public partial class Window1 : Window
22 {
23 public Window1()
24 {
25 InitializeComponent();
26 }
27
28 //定义 SerialPort对象
29 SerialPort port1;
30
31 //初始化SerialPort对象方法.PortName为COM口名称,例如"COM1","COM2"等,注意是string类型
32 public void InitCOM(string PortName)
33 {
34 port1 = new SerialPort(PortName);
35 port1.BaudRate = 9600;//波特率
36 port1.Parity = Parity.None;//无奇偶校验位
37 port1.StopBits = StopBits.Two;//两个停止位
38 port1.Handshake = Handshake.RequestToSend;//控制协议
39 port1.ReceivedBytesThreshold = 4;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数
40 port1.DataReceived += new SerialDataReceivedEventHandler(port1_DataReceived);//DataReceived事件委托
41 }
42
43 //DataReceived事件委托方法
44 private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
45 {
46 try
47 {
48 StringBuilder currentline = new StringBuilder();
49 //循环接收数据
50 while (port1.BytesToRead > 0)
51 {
52 char ch = (char)port1.ReadByte();
53 currentline.Append(ch);
54 }
55 //在这里对接收到的数据进行处理
56 //
57 currentline = new StringBuilder();
58 }
59 catch(Exception ex)
60 {
61 Console.WriteLine(ex.Message.ToString());
62 }
63
64 }
65
66 //打开串口的方法
67 public void OpenPort()
68 {
69 try
70 {
71 port1.Open();
72 }
73 catch { }
74 if (port1.IsOpen)
75 {
76 Console.WriteLine("the port is opened!");
77 }
78 else
79 {
80 Console.WriteLine("failure to open the port!");
81 }
82 }
83
84 //关闭串口的方法
85 public void ClosePort()
86 {
87 port1.Close();
88 if (!port1.IsOpen)
89 {
90 Console.WriteLine("the port is already closed!");
91 }
92 }
93
94 //向串口发送数据
95 public void SendCommand(string CommandString)
96 {
97 byte[] WriteBuffer = Encoding.ASCII.GetBytes(CommandString);
98 port1.Write(WriteBuffer, 0, WriteBuffer.Length);
99 }
100
101 //调用实例
102 private void btnOpen_Click(object sender, RoutedEventArgs e)
103 {
104 //我现在用的COM1端口,按需要可改成COM2,COM3
105 InitCOM("COM1");
106 OpenPort();
107 }
108 }
109 }


最后推荐你再看一下这篇文章,应该会很有帮助
http://scorpiomiracle.javaeye.com/blog/653923

发送:
int ii;
char i;
ii=data;//待发送数据
i=ii>>8;//取高8位
i&=0x0f;//取高4位
putchar(i);//发送高4位
i=ii&0xff;//取低8位
putchar(i);//发送低8r
接收:
int ii;
char i;
i=getchar();//收到高4位
ii=i;
ii<<=8;//ii左移8位
i=getchar();
ii+=i;// 得到12位数据

  • 易语言 单片机串口通讯问题 我做了个串口通讯软件,发现只能传输ASCII数...
    答:在串口输入数据加一段ASCII转HEX的程序,ASCII转HEX的程序很多。
  • 单片机串口调试问题
    答:用串口调试助手的话,有一个“十六进制接收”和“十六进制发送”的选项,你打上勾,就可以看到你用“a = 9”发送的十六进制数9了,否则串口调试助手会按ASC码来显示,0x9的ASC码是显示不出来任何东西的。你用“a='9'”发送的十六进制数是0x39,串口调试助手按ASC码来显示就是数字符号9。。
  • 每按一次单片机上的按键,把一个16进制的数据发送到串口利用串口调试助 ...
    答:ORG 0000H SJMP STA ORG 0023H LJMP SERINT ORG 0030H STA:MOV SP,#6FH SETB ES SETB EA LOOP:JB KEY,LOOP LCALL DELAY JB KEY,LOOP MOV SBUF,#DAT LCALL SEND SJMP LOOP DELAY:MOV R0,#10 D1:MOV R1,#200 DJNZ R1,DJNZ R0,D1 RET ;---串口中断程序--- SERINT:JBC RI,R_DA...
  • 单片机怎样通过串口向计算机发送数据
    答:单片机怎样通过串口向计算机发送数据:单片机可以实现与计算机的发送和接收。首先,要正确配置单片机的串口,包括波特率、使用时钟源、COM口、数据位位数、奇偶校验位、停止位位数等,同时要保证计算机的配置和单片机的一致。然后,把要发送的数据送到发送缓存,只能一个字节一个字节的发送。启动单片机发送,就...
  • C51如何接收和发送 串口工具 16位数据
    答:51单片机一次只能接收1个字节数据(8位),若要接收两个字节,串口工具应该分成两字节发送。比如先发送高字节,再发送低字节。对于 100H,按十六进制发送 01 00,单片机收到第一字节数据保存起来,收到第二字节后将两个8位数合并成16位数。
  • 请高手指教:用VB控件Winsock的UDP协议,发送16进制数到单片机出现问题...
    答:试试改成这样:fsData(i) = clng("&H" & txtData(i).Text)错误3:For j = 0 To 11 sckClient.SendData fsData(j) '这里发送了12个16进制的数据,结果串口助手上显示了4具错误的数据??Next j 不要用循环发送,直接发送数组:sckClient.SendData fsData ...
  • 单片机发数据给串口助手,为啥怎么都是十六进制的,我修改了好几次也不...
    答:单片机 没有 处理的 情况下,发送 接收 的 都是 十六进制数 串口助手 里可以 显示 十六进制数,也可以 显示 ASCII 字符 其实,如果 单片机 有程序处理,一样可以显示 字符、ASCII码 显示 十六进制数 没有什么关系,你能看懂就可以了 下一步 你 写 上位机 程序 时 要 处理、转换 的 ...
  • 串口调试助手发送16进制
    答:串口发送的数据是8位的,最大为255,就是FF,如果要发送大于255的数,必须变成几个字节发送,例如要发送十进制2315,就要将数据拆分 data(0)=2315/256;data(1)=2315%256;这样就拆分开数据,再将数据发送出去。
  • 用11.0592M晶振的单片机向串口发送十六进制数的程序:
    答:汇编:ORG 0000H MOV SCON,#50H ;串口工作于方式2 MOV TMOD,#20H ;定时器1工作于8位自动重装模式 MOV PCON,#00H ;波特率不加倍,可有可无的指令,单片机复位时会自动清0 MOV TH1,0FDH ;波特率9600的定时器初值 MOV TL1,0FDH TR1 = 1 ;启动定时器1 MOV R6,#01H MOV R...
  • 单片机发送到串口的是十六进制,用labview从串口读取的数据是什么格式的...
    答:如果发送的十六进制,可直接读出十六进制的数