精华内容
下载资源
问答
  • 盒子上可搜索关键字进行下载,TMS是.dpk文件,SPComm.pas文件; 安装方法自行百度,做赘述。 通过TMS控件进行界面布局 界面预览: Delphi通过SPComm连接串口、发送和接收指令 连接串口 拖一个TComm...

    第三方控件TMS、SPComm的下载与安装

    盒子上可搜索关键字进行下载,TMS是.dpk文件,SPComm.pas文件;

    安装方法自行百度,不做赘述。

     

    通过TMS控件进行界面布局

    界面预览:

     

    Delphi通过SPComm连接串口、发送和接收指令

    连接串口

    拖一个TComm控件到主窗体上,选中控件,单击F11,完成如下配置。

    这里主要是将一些布尔类型的属性设置成False,其他属性在前台连接按钮事件下动态设置。 

    连接代码如下,这里需要特别主意一下:

    当串口参数超过COM9(即COM10、COM11、COM12...)的时候,SPComm单元中有此BUG,ComName这里不可以直接赋值,需要做如下处理。

    CommName := '//./' + cbbCOM.Text;  

     1 procedure TMainFrm.advBtnConnectClick(Sender: TObject);
     2 var
     3   serialPortNO: string;
     4 begin
     5   try
     6     with comMain do
     7     begin
     8       StopComm;
     9       serialPortNO := Copy(cbbCOM.Text, 4, Length(cbbCOM.Text) - 3);
    10       BaudRate := StrToInt(cbbBaudRate.Text);
    11 //      ByteSize := TByteSize(cbbByteSize.ItemIndex);
    12 //      StopBits := TStopBits(cbbStopBit.ItemIndex);
    13 //      Parity := TParity(cbbCheckBit.ItemIndex);
    14       if StrToInt(serialPortNO) > 9 then
    15       begin
    16         CommName := '//./' + cbbCOM.Text;
    17       end
    18       else
    19       begin
    20         CommName := cbbCOM.Text;
    21       end;
    22       comMain.StartComm;
    23       connectStatus.Caption := 'Connected';
    24       connectStatus.FillColor := clLime;
    25       advBtnConnect.Enabled := False;
    26       gbSendMsg.Enabled := True;
    27     end;
    28   except
    29     connectStatus.Caption := 'Not Connected';
    30     connectStatus.FillColor := clRed;
    31     gbSendMsg.Enabled := False;
    32   end;
    33 
    34 end;

     

    发送指令

    WriteCommData(); 

     1 procedure TMainFrm.advBtnConfirmClick(Sender: TObject);
     2 begin
     3   if mmSendMsg.Lines.Count <= 0 then
     4   begin
     5     Application.MessageBox('There is no key word, please check the MsgSendList,thanks.', 'Error Information', MB_OK + MB_ICONSTOP);
     6     mmSendMsg.SetFocus;
     7     Exit;
     8   end;
     9   if cbByte.Checked then
    10   begin
    11     SendHex(mmSendMsg.Text);
    12   end
    13   else
    14   begin
    15     comMain.WriteCommData(PChar(mmSendMsg.Text), Length(mmSendMsg.Text));
    16   end;
    17   if (cbAutoSend.Checked) and (edtTime.Text <> '') and (cbByte.Checked) then
    18   begin
    19     timerMain.Interval := StrToInt(edtTime.Text);
    20     timerMain.Enabled := True;
    21   end;
    22 end;

    SendHex函数 

     1 procedure TMainFrm.SendHex(S: string);
     2 var
     3   s2: string;
     4   buf1: array[0..50000] of char;
     5   i: integer;
     6 begin
     7   s2 := '';
     8   for i := 1 to length(s) do
     9   begin
    10     if ((copy(s, i, 1) >= '0') and (copy(s, i, 1) <= '9')) or ((copy(s, i, 1) >= 'a') and (copy(s, i, 1) <= 'f'))
    11       or ((copy(s, i, 1) >= 'A') and (copy(s, i, 1) <= 'F')) then
    12     begin
    13       s2 := s2 + copy(s, i, 1);
    14     end;
    15   end;
    16   for i := 0 to (length(s2) div 2 - 1) do
    17     buf1[i] := char(strtoint('$' + copy(s2, i * 2 + 1, 2)));
    18   comMain.WriteCommData(buf1, (length(s2) div 2));
    19   mmMsg.Lines.Add('MsgSend[' + S + ']');
    20 end;

    接收指令

    选中控件,添加OnReceiveError事件,代码如下。

     1 procedure TMainFrm.comMainReceiveData(Sender: TObject; Buffer: Pointer;
     2   BufferLength: Word);
     3 var
     4   S: string;
     5   I, L: INTEGER;
     6   RBUF: array[0..2048] of BYTE;
     7 begin
     8   Move(Buffer^, pchar(@rbuf)^, BufferLength);
     9   L := BufferLength;
    10   for I := 0 to L - 1 do
    11   begin
    12     S := S + INTTOHEX(RBUF[I], 2);
    13   end;
    14   mmMsg.Lines.Add('MsgReceived[' + S + ']');
    15 end;

    断开串口连接

    comMain.StopComm;

    附录

      1 unit uMain;
      2 
      3 interface
      4 
      5 uses
      6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      7   Dialogs, StdCtrls, ExtCtrls, SPComm, RzPanel, AdvSmoothButton,
      8   AdvSmoothStatusIndicator, AdvGlassButton, RzButton, RzRadChk, RzStatus,
      9   RzPrgres;
     10 
     11 type
     12   TMainFrm = class(TForm)
     13     gbSerialParams: TRzGroupBox;
     14     gbMsg: TRzGroupBox;
     15     mmMsg: TMemo;
     16     gbPortSet: TRzGroupBox;
     17     gbSendMsg: TRzGroupBox;
     18     lbCom: TLabel;
     19     lbStopBit: TLabel;
     20     lbByteSize: TLabel;
     21     lbCheckBit: TLabel;
     22     lbBaudRate: TLabel;
     23     comMain: TComm;
     24     cbbCOM: TComboBox;
     25     cbbStopBit: TComboBox;
     26     cbbByteSize: TComboBox;
     27     cbbBaudRate: TComboBox;
     28     cbbCheckBit: TComboBox;
     29     gbMsgSendParams: TRzGroupBox;
     30     gbMsgSendList: TRzGroupBox;
     31     cbByte: TRzCheckBox;
     32     cbAutoSend: TRzCheckBox;
     33     lbCT: TLabel;
     34     edtTime: TEdit;
     35     advBtnConfirm: TAdvGlassButton;
     36     advBtnConnect: TAdvGlassButton;
     37     AdvGlassButton1: TAdvGlassButton;
     38     lbMs: TLabel;
     39     mmSendMsg: TMemo;
     40     statusBar: TRzStatusBar;
     41     clock: TRzClockStatus;
     42     versionStatus: TRzVersionInfoStatus;
     43     mqStatus: TRzMarqueeStatus;
     44     progressBar: TRzProgressBar;
     45     connectStatus: TRzStatusPane;
     46     timerMain: TTimer;
     47     procedure advBtnConnectClick(Sender: TObject);
     48     procedure comMainReceiveData(Sender: TObject; Buffer: Pointer;
     49       BufferLength: Word);
     50     procedure advBtnConfirmClick(Sender: TObject);
     51     procedure SendHex(S: string);
     52     procedure AdvGlassButton1Click(Sender: TObject);
     53     procedure timerMainTimer(Sender: TObject);
     54   private
     55     { Private declarations }
     56   public
     57     { Public declarations }
     58   end;
     59 
     60 var
     61   MainFrm: TMainFrm;
     62 
     63 implementation
     64 
     65 {$R *.dfm}
     66 
     67 procedure TMainFrm.SendHex(S: string);
     68 var
     69   s2: string;
     70   buf1: array[0..50000] of char;
     71   i: integer;
     72 begin
     73   s2 := '';
     74   for i := 1 to length(s) do
     75   begin
     76     if ((copy(s, i, 1) >= '0') and (copy(s, i, 1) <= '9')) or ((copy(s, i, 1) >= 'a') and (copy(s, i, 1) <= 'f'))
     77       or ((copy(s, i, 1) >= 'A') and (copy(s, i, 1) <= 'F')) then
     78     begin
     79       s2 := s2 + copy(s, i, 1);
     80     end;
     81   end;
     82   for i := 0 to (length(s2) div 2 - 1) do
     83     buf1[i] := char(strtoint('$' + copy(s2, i * 2 + 1, 2)));
     84   comMain.WriteCommData(buf1, (length(s2) div 2));
     85   mmMsg.Lines.Add('MsgSend[' + S + ']');
     86 end;
     87 
     88 
     89 procedure TMainFrm.advBtnConnectClick(Sender: TObject);
     90 var
     91   serialPortNO: string;
     92 begin
     93   try
     94     with comMain do
     95     begin
     96       StopComm;
     97       serialPortNO := Copy(cbbCOM.Text, 4, Length(cbbCOM.Text) - 3);
     98       BaudRate := StrToInt(cbbBaudRate.Text);
     99 //      ByteSize := TByteSize(cbbByteSize.ItemIndex);
    100 //      StopBits := TStopBits(cbbStopBit.ItemIndex);
    101 //      Parity := TParity(cbbCheckBit.ItemIndex);
    102       if StrToInt(serialPortNO) > 9 then
    103       begin
    104         CommName := '//./' + cbbCOM.Text;
    105       end
    106       else
    107       begin
    108         CommName := cbbCOM.Text;
    109       end;
    110       comMain.StartComm;
    111       connectStatus.Caption := 'Connected';
    112       connectStatus.FillColor := clLime;
    113       advBtnConnect.Enabled := False;
    114       gbSendMsg.Enabled := True;
    115     end;
    116   except
    117     connectStatus.Caption := 'Not Connected';
    118     connectStatus.FillColor := clRed;
    119     gbSendMsg.Enabled := False;
    120   end;
    121 
    122 end;
    123 
    124 procedure TMainFrm.comMainReceiveData(Sender: TObject; Buffer: Pointer;
    125   BufferLength: Word);
    126 var
    127   S: string;
    128   I, L: INTEGER;
    129   RBUF: array[0..2048] of BYTE;
    130 begin
    131   Move(Buffer^, pchar(@rbuf)^, BufferLength);
    132   L := BufferLength;
    133   for I := 0 to L - 1 do
    134   begin
    135     S := S + INTTOHEX(RBUF[I], 2);
    136   end;
    137   mmMsg.Lines.Add('MsgReceived[' + S + ']');
    138 end;
    139 //var
    140 //    tmpArray: array[0..4096] of Byte;
    141 //    i: DWORD;
    142 //    tmpStr: string;
    143 //    pStr: PChar;
    144 //begin
    145 //    pStr := Buffer;
    146 //    tmpStr := string(pStr);
    147 //    mmMsg.Lines.Add(tmpStr);
    148 //    Dec(PStr);
    149 //    for i := 0 to Length(tmpStr) - 1 do
    150 //    begin
    151 //        inc(PStr);
    152 //        tmpArray[i] := Byte(PSTR^);
    153 //        mmMsg.Lines.Add(IntToHEX(Ord(tmpArray[i]), 2));
    154 //    end;
    155 //    exit;
    156 //    pStr := Buffer;
    157 //    mmMsg.Lines.Add(pStr);
    158 //end;
    159 
    160 procedure TMainFrm.advBtnConfirmClick(Sender: TObject);
    161 begin
    162   if mmSendMsg.Lines.Count <= 0 then
    163   begin
    164     Application.MessageBox('There is no key word, please check the MsgSendList,thanks.', 'Error Information', MB_OK + MB_ICONSTOP);
    165     mmSendMsg.SetFocus;
    166     Exit;
    167   end;
    168   if cbByte.Checked then
    169   begin
    170     SendHex(mmSendMsg.Text);
    171   end
    172   else
    173   begin
    174     comMain.WriteCommData(PChar(mmSendMsg.Text), Length(mmSendMsg.Text));
    175   end;
    176   if (cbAutoSend.Checked) and (edtTime.Text <> '') and (cbByte.Checked) then
    177   begin
    178     timerMain.Interval := StrToInt(edtTime.Text);
    179     timerMain.Enabled := True;
    180   end;
    181 end;
    182 
    183 procedure TMainFrm.AdvGlassButton1Click(Sender: TObject);
    184 begin
    185   timerMain.Enabled := False;
    186   gbSendMsg.Enabled := False;
    187   cbByte.Checked := False;
    188   cbAutoSend.Checked := False;
    189   edtTime.Text := '';
    190   mmMsg.Text := '';
    191   mmSendMsg.Text := '';
    192   comMain.StopComm;
    193   connectStatus.Caption := 'Not Connected';
    194   connectStatus.FillColor := clRed;
    195   advBtnConnect.Enabled := True;
    196 end;
    197 
    198 procedure TMainFrm.timerMainTimer(Sender: TObject);
    199 begin
    200   SendHex(mmSendMsg.Text);
    201 end;
    202 
    203 end.

     

    转载于:https://www.cnblogs.com/jeremywucnblog/p/11452396.html

    展开全文
  • ECOM串口助手

    热门讨论 2011-09-02 23:43:34
    9、 支持键盘输入,将键盘数据发送到串口; 10、 支持定时保存接收窗口数据,便于查看长时间调试记录信息; 11、 有效的检测通讯错误,避免软件死机(如USB转串口设备拔出检测); 12、 数据接收窗口及文件发送均采用...
  • 一款带CRC计算的串口调试软件

    热门讨论 2011-10-29 21:16:16
    9、 支持键盘输入,将键盘数据发送到串口; 10、 支持定时保存接收窗口数据,便于查看长时间调试记录信息; 11、 有效的检测通讯错误,避免软件死机(如USB转串口设备拔出检测); 12、 数据接收窗口及文件发送均采用...
  • ECOM串口助手V2.00

    2011-09-27 22:29:52
    9、 支持键盘输入,将键盘数据发送到串口; 10、 支持定时保存接收窗口数据,便于查看长时间调试记录信息; 11、 有效的检测通讯错误,避免软件死机(如USB转串口设备拔出检测); 12、 数据接收窗口及文件发送均采用...
  • 问题:目前项目处于前期模拟阶段,故使用串口调试助手进行数据的模拟传输,但是发现串口数据接收端接收的数据时常完整,后来发现和程序的设置有关。 正文: 在开始之前,先给出需要使用的两款软件以及操作系统...

     


    前言:

    简要概述:现场的硬件传感器采集压力、速度等数据,通过串口将数据传输到现场服务器,本篇记录一部分通信协议的内容以及遇到的一个问题;

    问题:目前项目处于前期模拟阶段,故使用串口调试助手进行数据的模拟传输,但是发现串口数据接收端接收的数据时常不完整,后来发现和程序的设置有关。

     

    正文:

    在开始之前,先给出需要使用的两款软件以及操作系统及各个库的版本,因为是模拟,所以肯定要用上虚拟串口:1.virtual serial port driver(网上搜索有很多,根据自己需求下载版本);2.UartAssist串口调试助手(野人家园的调试助手都非常好用!)

    操作系统(也是为了方便大家学习参考):

                    版本:Windows10专业版;版本号:2004;操作系统版本:19041.264

    编辑器:PyCharm2019.1.2;集成库:Anaconda 1.9.12

                  Python 3.6.5(之前一直使用3.7.7,前段时间pyinstaller打包降到了3.6.5);

     

    一、串口模块

    在码代码之前肯定先要安装必要的模块或者库,这里只用了一个第三方模块——Pyserial,在命令提示符窗口运行安装命令:pip install pyserial

    Microsoft Windows [版本 10.0.19041.264]
    (c) 2020 Microsoft Corporation. 保留所有权利。
    
    C:\Users\jaysk>pip install pyserial
    Requirement already satisfied: pyserial in c:\users\jaysk\appdata\local\continuum\anaconda3\lib\site-packages (3.4)
    
    C:\Users\jaysk>pip show pyserial
    Name: pyserial
    Version: 3.4
    Summary: Python Serial Port Extension
    Home-page: https://github.com/pyserial/pyserial
    Author: Chris Liechti
    Author-email: cliechti@gmx.net
    License: BSD
    Location: c:\users\jaysk\appdata\local\continuum\anaconda3\lib\site-packages
    Requires:
    Required-by:

    我已经安装好了,所以提示“请求已满足”;而“pip show pyserial”是查看已经安装好的pyserial的版本信息以及安装路径;接下来就是串口模块的编码了,在此之前需要提醒一下:虽然安装的串口模块名称是“pyserial”,但是import的时候是import serial,这里需要留意!

    import serial
    import time
    
    
    class SerialRS485:
        def __init__(self, port, bps=115200, timeout=0):
            """
            串口初始化,配置参数
            :param port:端口号 
            :param bps: 波特率
            :param timeout: 超时时间
            """
            self.port = port  # 端口号
            self.bps = bps  # 波特率
            self.timeout = timeout  # 超时时间
            self.ser = serial.Serial(port, bps, timeout=timeout)  # 开启串口
            self.set_buffer = serial.Serial.set_buffer_size(self.ser, rx_size=8192)  # 重新配置接收缓存大小
    
        def port_open(self):
            """
            打开串口
            """
            if not self.ser.is_open:
                self.__init__(self.port, self.bps, self.timeout)    # 这里我直接进行串口初始化,替代直接打开串口
    
        def port_close(self):
            self.ser.close()
    
        def port_read(self):
            """
            接收数据,即读串口
            :return: 接收到的数据
            """
            count_all = 0
            received_all = b''
            if self.ser.is_open:
                print('--------------- 串口已经打开,等待接收数据 ---------------')
                while True:
                    count = self.ser.in_waiting
                    if count > 0:
                        received_data = self.ser.read(count)
                        if received_data == b'exit':    # 串口调试助手是以“bytes”的类型发送的数据,所以做退出判定的时候要注意!
                            print('--------------- 共接收到%d字节的数据,数据已接收完毕,串口关闭 --------------- ' % count_all)
                            time.sleep(5)    # 延时5s关闭串口
                            self.port_close()
                            break
                        else:
    
                            received_all += received_data
                            count_all += count
                            print('本次接收到%4d字节的数据,目前共计接收%g字节的数据' % (count, count_all))
            return received_all
    
        def reopen_read(self):
            self.port_open()
            print('该串口再次开启')
            self.port_read()

    到此串口模块部分编码完成,其中在串口初始化的模块中,缓存区的配置至关重要,在后面的问题解决中会详细说明。

     

    二、设备端口检测模块

    如果你使用的设备上没有串口可供调试的话,就需要安装前面提到的“virtual serial port driver”软件啦,如图1红框中所示,左边是设备管理器中用虚拟串口软件“造”出来的虚拟串口,右边就是这个软件,至于安装及操作见参考文献1。

    图1 设备管理器中的端口&虚拟串口软件
    图1 设备管理器中的端口&虚拟串口软件

    检测设备是否有端口,并且是否可用,代码如下:

    import serial.tools.list_ports as lps
    
    def check_ports():
        """
        检查设备中有无端口,以及各个端口是否能够使用
        :return: 可用端口
        """
        ports = []
        available_ports = []
        serial_ports = lps.comports()   # 系统端口的列表
        for p in serial_ports:
            ports.append(p.device)
        if len(ports) > 0:
            print('该设备有以下串口:', ports)
            print('--------------- 各个串口信息如下 ---------------')
            for port in ports:
                try:
                    main_ser = SerialRS485(port)
                    available_ports.append(main_ser.ser.port)
                    print('%s串口可用,波特率为:%d' % (main_ser.ser.port, main_ser.ser.baudrate))
                except Exception as e:
                    err = e.args[0]
                    if err[:19] == 'could not open port':
                        print('%s串口被占用' % err[21:25], '异常信息:', e)
        return available_ports

     

    三、选择端口模块

    知道有可用的端口后,就需要从该可用端口接收数据了。因为串口成对出现,所以匹配的时候,一般都是一个发数据一个接数据,两端口不混用,例如:COM1口发送数据,COM2口接收数据,以此类推……

    def select_port(available_ports):
        """
        从可用端口中选择可以接收数据的端口
        :param available_ports: 可用端口(两种端口不混用)
        :return: 可用于接收数据的端口
        """
        rec_ports = []
        if len(available_ports) >= 1:
            for ava_port in available_ports:
                if int(ava_port[3]) % 2 == 0:
                    print('%s串口可以用来接收数据' % ava_port)
                    rec_ports.append(ava_port)
                else:
                    print('%s串口应该用来发送数据' % ava_port)
        return rec_ports

     

    四、主程序

    写个简单的主程序测试下。

    def main():
        """
        串口通信主程序
        :return: 返回接收到的数据
        """
        ap = check_ports()  # 检测可用串口
        sp = select_port(ap)  # 选择串口进行数据接收
        if len(sp) >= 1:
            my_ser = SerialRS485(sp[0])
            print('当前使用的串口为:%s' % my_ser.port)
            rec_all = my_ser.port_read()
            return rec_all
        else:
            print('无可用于接收数据的串口')
    
    
    if __name__ == '__main__':
        main()

     

    五、结果展示

    (待更新)(后期可能会放上视频)

    六、问题解决

    (待更新)

    参考文献:(感谢以下文献的贡献者们!)

    1.串口调试助手怎么用_串口调试助手使用方法

    2.野人家园

     

     

     

    展开全文
  • 友善串口调试助手是一个很好而小巧的串口调试助手,完美支持Win7等Windows操作系统。友善串口调试助手支持常用的50-256000bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符...
  • 普中蓝牙模块使用

    2020-03-13 16:03:44
    如果是上电长亮说明是直接进入了一个AT模式和配对模式,可以使用手机搜索到蓝牙模块,配对上,但是手机里面的蓝牙系统是连接上HC-06的,需要额外下载一个蓝牙串口,在蓝牙串口连接上模块之后,...

    使用的是HC-06模块

    HC-06默认的波特率是9600,8位数据为,1位停止位,无校验位
    在使用串口助手调试的时候,需要勾选自动换行,这里选用的友善串口助手

    修改蓝牙的AT指令可以查看蓝牙芯片手册,AT指令

    如果是上电长亮说明是直接进入了一个AT模式和配对模式,可以使用手机搜索到蓝牙模块,配对上,但是手机里面的蓝牙系统是连接不上HC-06的,需要额外下载一个蓝牙串口,在蓝牙串口连接上模块之后,模块的指示灯常亮,这时可以进行通信

    2020.3.11


    在经过12号一天对LCD12864液晶显示屏的后,继续HC-06蓝牙模块的使用

    • 目的:手机连接蓝牙模块控制LED的亮灭

    蓝牙模块和单片机之间的通信是UART串口方式,使用的是圣芯的HC89S003F4单片机,连接好蓝牙模块和单片机,手机发送信息给蓝牙模块,蓝牙模块将接收到的信息通过UART转发给单片机

    无线信号
    UART
    手机
    蓝牙模块
    单片机

    只需要在单片机里面处理接受到的信号就可以了,所以说非常的简单

    接下来是代码

    main.c
    #define	ALLOCATE_EXTERN
    
    #include "lcd12864.H"
    #include "public.h"
    #include "time.h"
    #include "bt.h"
    
    void main(void)
    {
    	WDTCCR = 0x00;						
    	CLKSWR = 0x51;						//选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
    	CLKDIV = 0x01;						//Fosc 1分频得到Fcpu,Fcpu=16MHz 
    	
    	Lcd12864_Init();
    	Timer_Init();
    	Bt_Init();
        Lcd_Init();
        LCD_Clear();
    	
    	EA = 1;								//使能总中断
    	
        while (1)
        {
    		Rx_Proc();
        }
    }
    
    bt.c
    #include "time.H"
    #include "lcd12864.H"
    
    xdata uint8_t RecBuff[15] = {0};
    xdata uint8_t RxCount = 0;
    bit Rx_Done = 0;
    bit Rx_Start = 0;
    
    /**
     * @name	Bt_Init[蓝牙初始化]
     */
    void Bt_Init(void)
    {
    	/*LDE初始化*/
    	P2M1 = P2M1&0xF0|0x08;			//P22设置为推挽输出
    	LED = 1;
    	
    	P2M0 = P2M0&0x0F|0x80;			//P21设置为推挽输出
    	P0M1 = P0M1&0x0F|0x20;			//P03设置为上拉输入
    	TXD_MAP = 0x21;					//TXD映射P21
    	RXD_MAP = 0x03;					//RXD映射P03
    	T4CON = 0x06;					//T4工作模式:UART1波特率发生器
    	
    	/*
    	T4计数+1时间 = T4时钟/T4分频/16
    	波特率+1信号时间 = 1/9600(波特率)---[9600波特率是每秒传输9600个0/1电平信号]
    	初值 = T4计数+1时间/波特率+1信号时间
    	*/
    	TH4 = 0xFF;
    	TL4 = 0x98;							//波特率9600
    	SCON2 = 0x02;						//8位UART,波特率可变
    	SCON = 0x10;						//允许串行接收
    	IE |= 0X10;							//使能串口中断
    }
    
    /**
     * @name	
     */
    void UART1_Rpt(void) interrupt UART1_VECTOR
    {
    	if(SCON & 0x01)						//判断接收中断标志位
    	{
    		if (rx_timeout.flag)			//超时
    			return;
    		else 
    		{
    			rx_timeout.start = 1;		//开启超时
    			rx_timeout._10ms = 10;		//重置定时器时间
    			Rx_Start = 1;				//开始接收
    		}
    		RecBuff[RxCount++] = SBUF;//转存8位串口接收数据
    		if(RxCount >= 15)
    		{
    			SCON &=~ 0x10;				//失能UART1接收
    			Rx_Done = 1;
    		}
    		SCON &=~ 0x01;					//清除接收中断标志位
    	}
    }
    
    /**
     * @name	Rx_Proc[接收包处理]
     */
    void Rx_Proc(void)
    {
    	if (Rx_Start == 0)
    		return;
    	if (rx_timeout.flag)			//接收超时,相当于接收完成,需要对接收准备复原
    	{
    		rx_timeout.flag = 0;
    		RxCount = 0;
    		Rx_Done = 1;
    		SCON &=~ 0x10;				//失能UART1接收
    		Rx_Start = 0;
    	}
    
    	if(Rx_Done)
    	{
    		LCD_Clear();
    		if (strcmp((uint8_t*)RecBuff,"ON")==0)
    		{
    			LCD_Display_Words(0, 0, "开灯:");
    			LCD_Display_Words(0, 3, RecBuff);
    			P2_2 = 0;
    		}
    		else if (strcmp((uint8_t*)RecBuff,"OFF")==0)
    		{
    			LCD_Display_Words(0, 0, "关灯:");
    			LCD_Display_Words(0, 3, RecBuff);
    			P2_2 = 1;
    		}
    		else
    		{
    			LCD_Display_Words(0, 0, "未知命令:");
    			LCD_Display_Words(0, 5, RecBuff);
    		}
    		
    		Rx_Done = 0;
    		RxCount = 0;						//接收指针复位
    		memset(RecBuff, 0, sizeof(RecBuff));
    		SCON |= 0x10;						//允许串行接收
    		
    	}
    }
    
    

    这里面的接收采用的是一个10ms的超时检测,在收到第一个字节后开始10ms超时检测,10ms后没有收到字节认为接收完成,同时结合LCD显示

    bt.h
    #ifndef _BT_H_
    #define _BT_H_
    
    #include "public.h"
    
    #define LED	P2_2
    
    extern xdata uint8_t RecBuff[15];
    
    void Bt_Init(void);
    void Rx_Proc(void);
    
    #endif
    
    
    time.c[粗糙软定时器]
    #include "time.h"
    
    xdata RX_TIMEOUT rx_timeout;
    
    /**
     * @name	Timer_Init[定时器初始化]
     */
    void Timer_Init(void)
    {
    	TCON1 = 0x00;						//Tx0定时器时钟为Fosc
    	TMOD = 0x00;						//16位重装载定时器/计数器
    	
    	TH0 = (65536-1333) / 256;			//256是0xFF,大于0xFF的都是256的商
    	TL0 = (65536-1333) % 256;			//T0定时时间1ms
    	IE |= 0x02;							//打开T0中断
    	TCON |= 0x10;						//使能T0
    	
    	rx_timeout.flag = 0;
    }
    
    /**
     * @name	定时器中断
     */
    void TIMER0_Rpt(void) interrupt TIMER0_VECTOR
    {
    	if (rx_timeout.start)
    		rx_timeout._10ms--;
    	if (rx_timeout._10ms == 0)
    	{
    		rx_timeout.flag = 1;
    		rx_timeout._10ms = 10;
    		rx_timeout.start = 0;
    	}
    }
    
    time.h
    #ifndef _TIME_H_
    #define _TIME_H_
    
    #include "public.h"
    
    typedef struct{
    	uint8_t _10ms;
    	uint8_t flag:1;
    	uint8_t start:1;
    }RX_TIMEOUT;
    
    extern xdata RX_TIMEOUT rx_timeout;
    
    void Timer_Init(void);
    
    #endif
    
    

    基本上代码就是这样了,LCD显示的代码

    展开全文
  • 如果我们在一些和硬件打交道的公司,我们需要开发一些App,难免会用手机连接usb来...这时候我们就需要用到以下的一个工具,“USR-TCP232”,这个串口/网络调试助手,自行去百度搜索下载. http://www.smzy.com/smzy/down1...

    在和硬件打交道的需求中,需要把我们的测试机连接一些usb数据的东西.
    这个时候我们想要在AS上查看日志,因没数据线所以看不到实时日志.

    这时候我们就需要用到以下的一个工具,“USR-TCP232”,这个串口/网络调试助手,自行去百度搜索下载.

    http://www.smzy.com/smzy/down118428.html

    这个链接是我在网上找的,应该可以下载下来,因为我电脑上有这个工具,我没下载.这个不可以的话,自行找一个可以打开的.

    界面大概是这样的
    在这里插入图片描述
    操作步骤

    PC端

    1.更改udp方式

    在这里插入图片描述
    我们选择udp,选择完成之后,自动会选择你当前的ip地址.如果没有自动设置,请自行去查看本地ip地址

    2.设置端口号

    设置端口号尽量写一个独特的,不可思议的不要超过65535.不要和设备上别的端口有冲突.这样会出现意想不到的错误.

    3.开启连接

    图中的(1),(2),(3)设置完毕之后点击Connect,然后这个工具就告辞一段落了.我没让你关掉…后台挂着

    Android端

    这里就不同了,因为我们连接的方式是用udp方式连接,所以我们要在APP里写一段udp连接方式

    初始化udp工具.

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // 注册udp发送命令
            UdpUtils.instance.init()
    }
    
    import java.io.IOException
    import java.net.DatagramPacket
    import java.net.DatagramSocket
    import java.net.InetAddress
    import kotlin.concurrent.thread
    
    import java.io.IOException
    import java.net.DatagramPacket
    import java.net.DatagramSocket
    import java.net.InetAddress
    import kotlin.concurrent.thread
    
    /**
     * Created by Android Studio.
     * User: GGY
     * Date: 2020/3/24
     *  此类使用手机连接设备无法在AS上查看日志,通过udp把日志发送pc端查看日志.
     *  使用:打开udp工具类,切换udp连接,随便写一个端口号(最好独特一些,不要和别的应用有冲突,比如,11111,22222,不要超过65535)
     *  然后打开连接,udp工具完事.,
     *  本类里需要改动在udp工具里写的那个端口号监听
     */
    class UdpUtils private constructor() {
        companion object {
            val instance by lazy { UdpUtils() }
        }
    
        lateinit var datagramSocket: DatagramSocket
        lateinit var threadPoolExecutor: ExecutorService
        fun init() {
            datagramSocket = DatagramSocket()
            threadPoolExecutor = Executors.newFixedThreadPool(1)
        }
    
        fun log(data: String) {
            threadPoolExecutor.execute {
                try {
                    val serverAddress = InetAddress.getByName("192.168.3.245")
                    val toUByteArray = CodeUtil.haha(data)
                    //  这个端口号要写udp工具里写的
                    val packet = DatagramPacket(toUByteArray, toUByteArray.size, serverAddress, 30000)
                    datagramSocket.send(packet)
                } catch (e: IOException) {
                }
            }
        }
    }
    // CodeUtil.haha
    public static byte[] haha(String data) {
            byte[] a = new byte[0];
            try {
                a = data.getBytes("utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return a;
        }
    

    使用

     UdpUtils.instance.log("id:$id lac:$lac lon:$lon arfcn:$arfcn")
    

    测试图:
    在这里插入图片描述

    注意:pc端和手机端务必在一个网络下,否则会获取不到log的

    展开全文
  • 这时候我们就需要用到以下的一个工具,“USR-TCP232”,这个串口/网络调试助手,自行去百度搜索下载. http://www.smzy.com/smzy/down118428.html 这个链接是我在网上找的,应该可以下载下来,因为我电脑上有这个工具,我没...
  • 注意:在串口助手调试过程中, 每次发送都要加上!!!换行!!!,且能有多于的!!!空格!!!,否则8266会将发送的数据原样返回 AT 返回值为OK AT+CWMODE=1 返回值为OK,设置模块为STA模式,此时可以连接WIFI AT+...
  • 无名创新飞控开源飞控地面站是无名小哥为广大自研飞控开发者、电子发烧友们专门开发的一款多功能上位机软件,地面站功能涵盖:飞控状态显示、数据波形、参数调试、虚拟遥控器、飞控传感器校准串口助手常用等,开发此...
  • 万能文本编辑器V1.3

    2011-04-10 16:44:03
    10、串口调试助手:专门为自己写的一款串口调试助手,拥有自己想要的全部人性化功能,支持虚拟串口等,任意插拔USB转换的串口不会卡住; 11、行比较软件:比较两段文字是否匹配; 12、数码管字形编码工具:搞...
  • Android串口开发工具 图片尺寸处理工具 图片压缩工具 资源清理工具 px和dp转换/计算工具 Java To iOS JSON/XML转换为POJO Class工具 Java DAO Generate工具 Chrome插件 Android插件 JSON/XML格式化插件 Encode/...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) VC++遍历...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    12:连接到搜索引擎. 13:自动报告bug,建议等. 14:宏功能. 15:自动同步文件夹. 16:保存加载任务. 17:计划任务. 18:单线程下载时能创建临时文件. 19:下载流文件(rm,Media Player). Notepad++ V5.6.8 源码! 如题。 ...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    光盘提供了书中所有实例的源代码,全部源代码都经过精心调试,在Windows XP/Windows 2000/Windows Server 2003等操作系统下测试通过,均能够正常运行。  本书适合程序开发人员,也可供大中专院校师生阅读。 目 ...
  • 光盘提供了书中所有实例的源代码,全部源代码都经过精心调试,在Windows XP/Windows 2000/Windows Server 2003等操作系统下测试通过,均能够正常运行。  本书适合程序开发人员,也可供大中专院校师生阅读。 目 ...
  • 光盘提供了书中所有实例的源代码,全部源代码都经过精心调试,在Windows XP/Windows 2000/Windows Server 2003等操作系统下测试通过,均能够正常运行。  本书适合程序开发人员,也可供大中专院校师生阅读。 目 ...
  • 光盘提供了书中所有实例的源代码,全部源代码都经过精心调试,在Windows XP/Windows 2000/Windows Server 2003等操作系统下测试通过,均能够正常运行。  本书适合程序开发人员,也可供大中专院校师生阅读。 目 ...
  • ACCESS 高级表格.ec Access操作.ec Access数据库压缩修复新建.ec ACCSEE记录显示超级列表框模块.ec ACSII 加解密模块2.0.ec AD.ec ADO方式填充树型框.ec API操作模块.ec API的使用方法.ec API 设置颜色对话框...
  • 1350多个精品易语言模块提供下载

    热门讨论 2011-06-06 17:51:09
    ACCESS 高级表格.ec Access操作.ec Access数据库压缩修复新建.ec ACCSEE记录显示超级列表框模块.ec ACSII 加解密模块2.0.ec AD.ec ADO方式填充树型框.ec API操作模块.ec API的使用方法.ec API 设置颜色对话框...
  • 1345个易语言模块

    2012-01-27 19:41:59
    ACCESS 高级表格.ec Access操作.ec Access数据库压缩修复新建.ec ACCSEE记录显示超级列表框模块.ec ACSII 加解密模块2.0.ec AD.ec ADO方式填充树型框.ec API操作模块.ec API的使用方法.ec API 设置颜色对话框...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

串口调试助手搜索不到串口