1.先上一个ASCII表


ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
请注意,ASCII是American Standard Code for Information Interchange缩写,而不是ASCⅡ(罗马数字2),有很多人在这个地方产生误解。
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。
为了好记,总结一句话:ASCII就是相当于十进制数(二进制转换)。

2.明确一点:发送和接收数据的过程全部都是以ASCII来进行的。

3.在通信时,一般的串口通信都是以ByteArray来进行发送,那么它其实就是ASCII,那么就不需要担心数据会变化。

4.如果在网络通信中,例如一个套接字程序中,事先定义好的变量类型是char,即字符型,当发送时是以字符串来发送的话,那么发送的过程会自动以这些字符对应的ASCII进行发送。下面解决此问题。

5.十六进制发送:

void CChatClientDlg::CmdSend()       //命令发送函数(16进制)
{// TODO:  在此添加控件通知处理程序代码CString temp_str;char temp_hex[1024] = { '\0' };int strlen;int  i, j;//////////////cstring  转换成  hex数组   temp_str = m_CmdWords;temp_str = temp_str.Trim();//去掉chr首尾的空格strlen = temp_str.GetLength();char* temp_char = (char*)(LPCTSTR)temp_str;for (j = 0, i = 0; i < strlen; i++)   //字符串清除空格{if (temp_char[i] != ' '){temp_char[j] = temp_char[i];j++;}}temp_char[j] = '\0';//字符串结束for (i = 0; temp_char[i] != '\0'; i++)//判断是否为16进制字符{if (!(((temp_char[i] >= '0') && (temp_char[i] <= '9')) || ((temp_char[i] >= 'A') && (temp_char[i] <= 'F')) || ((temp_char[i] >= 'a') && (temp_char[i] <= 'f')))){MessageBox(_T("有非十六进制字符,请重新输入"));return;}}for (j = 0, i = 0; temp_char[i] != '\0'; i += 2)//转换为16进制  即"ef"转换为0xef{if (temp_char[i + 1] == '\0'){MessageBox(_T("输入数据个数不正确,请重新输入"));return;}temp_hex[j] = (char)(ascii2hex(temp_char[i]) * 16 + ascii2hex(temp_char[i + 1]));j++;}CString strMsg(temp_hex);strMsg = strMsg.Trim();//去掉首尾的空格i = send(m_client, strMsg.GetBuffer(0), strMsg.GetLength(), 0);m_ListWords.AddString("发送: " + strMsg);m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);
}int CChatClientDlg::ascii2hex(char ch)   //ascii码转16进制
{int hex = 0;if ((ch >= '0') && (ch <= '9')){hex = ch - '0';}else if ((ch >= 'A') && (ch <= 'F')){hex = ch - 'A' + 10;}else if ((ch >= 'a') && (ch <= 'f')){hex = ch - 'a' + 10;}else{hex = -1;}return hex;
}

6.十六进制显示

void CChatClientDlg::ReceiveData()                 //接收数据处理函数
{UpdateData();char buffer[1024];CString temp_str,temp_str1;CButton* p_check;p_check = (CButton*)GetDlgItem(IDC_CHECK_HEXRECEIVE);if (p_check->GetCheck() == FALSE){//ASCII显示接受数据int num = recv(m_client, buffer, 1024, 0);buffer[num] = '\0';//将接收到的数据添加到列表框中CString sTemp;sTemp.Format("收到: %s", buffer);//接收完数据后继续侦测WSAAsyncSelect(m_client, m_hWnd, 10000, FD_READ | FD_CLOSE);m_ListWords.AddString(sTemp);m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);}else{//十六进制显示接受数据int num = recv(m_client, buffer, 1024, 0);buffer[num] = '\0';for (int k = 0; k < num; k++) //将数组转换为 CString 型变量{//下一条语句,显示2个字符一个空格temp_str.Format(_T("%-3.2x"), buffer[k]);temp_str1 += temp_str;}m_ListWords.AddString("shou: " + temp_str1);m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);}
}

7.浅谈十六进制显示

一般的数据发送和接收以ByteArray来进行,而套接字中是以char型来发送和接收数据时,那么就会出现一个bug,假设PLC发送的是十六进制的AA(大于127),发出来后对应的ASCII:170,而他没有对应的字符,所以套接字中对其无法进行正常的显示了(乱码),所以最好在通信时都以ByteArray来发送接收。假如假设PLC发送的是十六进制的55,发出来后对应的ASCII:85,而他有对应的字符U,所以不勾选十六进制显示时显示U,勾选之后执行temp_str.Format(_T(“%-3.2x”), buffer[k]);
temp_str1 += temp_str;把U转成十六进制55显示。

8.着重讲一下十六进制发送

比如我在一个上位机界面的编辑框中输入一个16进制数48,那么其实它是一个字符串,点击十六进制发送,此时最重要的是这一句:

temp_hex[j] = (char)(ascii2hex(temp_char[i]) * 16 + ascii2hex(temp_char[i + 1]));

这里temp_hex[j]是一个char型数组,(char)右边的数据是一个整形的数据,即72,那么(char)之后得到的是什么呢?
新建一个Win32控制台程序,里面输入以下的代码:

#include "stdafx.h"
#include <iostream>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{char ch;int k = 48;ch = (char)k;//注意这里cout << "x=" << ch << endl;getchar();return 0;
}

程序运行结果如下:x=0
可以看出这是ASCII表里面中0x48对应的字符。
此时就彻底醒悟了,temp_hex[j]进行发送是发送0,然后发送的过程中就是发送0对应的ASCII:72,然后在接收端程序中,例如PLC程序中,就将这个72以十六进制的方式进行显示及存储就得到的48了,完美理清!

关于十六进制发送和显示(VS上位机和下位机)相关推荐

  1. 计算机基础-工控机、上位机、下位机、stm32、单片机

    工控机 定义:(Industrial Personal Computer,IPC)即工业控制计算机,主要用于工业生产上. 性能:采用全钢机箱,抗震性能好,抗电磁干扰,抗冲击. 结构:包括CPU.io外 ...

  2. QT5实现串口收发数据(上位机与下位机通信)

    最近帮老师做一个应用程序,通过上位机与下位机进行串口通信,最后实现实时绘图,通过几天努力,成功实现蓝牙串口通信. 参考博客1 注意:代码中一些与串口无关代码,可以忽略掉 一.QT5串口基础知识 1. ...

  3. 关于Qt上位机与下位机stm32数据传输的解析问题(一)

    在制作上位机中,我们常常要把单片机上的数据,比如曲线图.电机速度.信号频率幅值等显示在上位机软件中,那么就需要下位机方将数据不断传给上位机以在Qt的QLCDNumber或者Qchart不断刷新,这是上 ...

  4. 上位机与下位机都是个啥?

    上位机与下位机都是个啥? 基础概念 上位机是指人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等). 下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机 ...

  5. 上下位机通讯协议_上位机与下位机的区别通讯

    上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等).下位机是直接 ...

  6. 上位机和下位机的概念,理解如何实现PC从PLC中读取数据?

    市面上的PLC有上百种, 西门子的, 三菱的, 欧姆龙的等等. 上位机和下位机的理解: 上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/ ...

  7. 打开单片机世界的大门——上位机控制下位机实例详解

    上位机控制下位机实例详解 一.基本概念 上位机与下位机 串口 数据表达 二.下位机程序 三.上位机程序 四.总结 一.基本概念 在开始讲解前,先来看几个基本概念,如果是有基础的大佬,请直接跳到下一节. ...

  8. 什么是上位机、下位机

    上位机 上位机是指可以直接发出操控命令的计算机, 一般是PC/host computer/master computer/upper computer, 屏幕上显示各种信号变化(液压,水位,温度等). ...

  9. java实现上位机与下位机串口通信

    串口通信是在工程应用中很常见.在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用.在说个之前先来简单解释一下上位机与下位机的概念. 上位机与下位机 通常上位机指的 ...

  10. 上位机、下位机的初略解释

    上位机是指:人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等).下位机是直接控制设备获取设备状况的的计算机,一般是PLC/单片机之类的.上位机发出的命令首先给下位 ...

最新文章

  1. LeetCode 709 To Lower Case -- java,python解法
  2. cinder配置多ceph储存池[Ceph and Cinder multi-backend]
  3. Windows Server 2016之RDS配置证书
  4. SpringCloud Ribbon(六)之服务实例过滤器ServerListFilter
  5. ***经验谈之SA权限***的感悟
  6. java设计模式2-观察者模式
  7. 世界上第一台计算机国际象棋大师是如何诞生的?
  8. Java开发入门与实战!java图形用户界面布局
  9. Django 一些少用却很实用的orm查询方法
  10. and or not 优先级_我的家乡|我的侠客公测成就奖励大全 成就解锁优先级排名
  11. Unity基础知识—Transform
  12. 二维数组行列互调显示出来。如:123456789变成147258369。
  13. 获取中国票房网的五年间年度票房的数据信息(初学者完整代码)
  14. 软件工程——(1)软件与软件工程 思维导图
  15. wiki百科词向量训练资料及其模型
  16. NOIP 2020 螺旋升天爆炸记
  17. CSS动画之旋转魔方轮播
  18. 计算机网络技术主要包括计算机技术和什么,《计算机网络技术》第6章作业的参考答案...
  19. MobileInfo
  20. 【C语言刷题】文件操作章节配套练习(选择题 + 编程题)

热门文章

  1. 【UEFI实战】UEFI中使用汇编代码
  2. wordpress入门主题_WordPress儿童主题入门
  3. outlook自定义快捷键_如何在Outlook中自定义待办事项窗格
  4. dede标签使用大全
  5. ubuntu 下载以及安装CPAN
  6. A - Browsing History
  7. 阿里巴巴达摩院夺得首届“马栏山杯”国际音视频算法优化大赛【画质损伤修复赛道】冠军
  8. java 163邮箱发邮件_java用163邮箱发邮件的方式,步骤有哪些?
  9. JAVA后台,对上传资源限定大小
  10. 超级表格企业版,最实用的三个功能