前期操作的项目一直是通过串口进行有线连接。目前客户客户需求,需要进行WIFI通讯,故总结技术要点如下。
1.EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
2.DSP 数字信号处理,英文:Digital Signal Processing,
《数字信号处理》这门课介绍的是:将事物的运动变化转变为一串数字,并用计算的方法从中提取有用的信息,以满足我们实际应用的需求。
DSP芯片,也称数字信号处理器,是一种特别适合于进行数字信号处理运算的微处理器,其主要应用是实时快速地实现各种数字信号处理算法。
3.ZigBee是基于IEEE802.15.4标准的低功耗局域网协议。根据国际标准规定,ZigBee技术是一种短距离、低功耗的无线通信技术。
ZigBee协议从下到上分别为物理层(PHY)、媒体访问控制层(MAC)、传输层(TL)、网络层(NWK)、应用层(APL)等。其中物理层和媒体访问控制层遵循IEEE 802.15.4标准的规定。
4.Arduino是一款便捷灵活、方便上手的开源电子原型平台。
5.AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。
6.WIFI无线串口服务器
USR-WIFI232-610 V2是一款高性能WIFI无线串口联网服务器,将RS232串口设备和RS485设备转换成WIFI无线网络,支持通过手机或者笔记本电脑进行控制,也可以连到远程服务器。
WIFI串口服务器可以作AP(WIFI热点)支持其他设备联入,也可以做为Station联入普通的无线WIFI网络。
7.c语言的源文件后缀是“.c”,c语言头文件的后缀是".h",c++的源文件后缀是“cpp”。
a:archive.归档的意思,是把很多库打包形成的,里面有函数可以用
.h是头文件。里面声明了一些常量和函数,包含之后可以使用那些常量和函数,
在windows下
.c C语言源文件(在写好的源代码后缀加.c其实等于编译预处理)
.obj 汇编后程序
.exe 链接后程序
在Linux下
.c C语言源文件
.o(.ko) 汇编后程序
可执行程序无后缀
8.Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购)。它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用。
9.ESP8266模块是一种集成模块,且有透传特性。但无论是否透传,只要硬件方面烧录了相关的集成程序,即让ESP8266做为中间站传输采集器与手机或PC终端的数据,即可实现无线连接操作。即上位机需要操作的功能,无线模块与有线模块一致,只需调用相关的函数即可。但下位机亦一样,即亦需调用相关的功能函数并进行烧录即可。所不同的是,上下位机需要相互配合,且需了解相关的功能函数。
10.XAMARIN的异线程更改UI界面问题,一般有以下几种方法:
10.1 通过消息机制进行传递,此为最基本的方法。后面几种或许是对该方法的集成。
10.2 View.Post(() => { }); View.postDelay(() => { });
10.3 runOnUiThread(() => { });
11.对于ANDROID编程中布局的设置,一般可以通过以下几种方式实现。
11.1在Activity中进行设置. 思路,获取屏幕的宽高,拿到控件的布局参数,之后进行宽高设置
11.2 使用LinearLayout的权重,进行适配屏幕的宽度:
12.Finish()函数用于关闭一个ACTIVITY,即关闭程序。
13.SOCKET特性总结:
13.1 打开后必须正确关闭CLOSE(),否则重复打开会出现错误。即服务器根据自身的配置,只能限制有限的连接。
13.2若本地客户端SOCKET已关闭,则无法使用该变量,不能发送数据。
13.3若服务器端SOCKET关闭,即端口关闭,则本地可以发送数据,但无回应,因此,判断服务器端是否关闭,需要进行所谓的心跳测试。
13.4一般本地客户端的接收操作在一个线程中进行(可以与主线程不同的线程),若打开多个线程分别进行接收,则容易出现错误。
13.5在客户端连续发送命令后,若上一个的返回数据仍没有接收,则容易出现异常,故最好在发送数据之间确定一个最小的时间间隔,即时是200MS即可。即也有可能时缓存问题。即两条命令分别存入缓存后成一条命令发送了。
13.6通讯时注意逻辑及时间先后关系。
14.获取本机IP地址的常用操作。
string name= Dns.GetHostName();IPAddress[] addd = Dns.GetHostAddresses(name); string ip2 = addd[0].ToString();
15.编程出现问题时一定要对症下药,不然会浪费时间。入某个类不可访问时,需要查看该类的定义及访问级别,然后进行相应的解决。
16.对于WIFI的搜索与连接,若调用API,则进行封装后可以在手机,PC等不同平台使用,但若借助命令行,则只能在PC端,且是WINDOS系统时能用,手机端不能使用。
17.若引用某个DLL时出现异常,可以尝试更改之,引用DLL的目的无非是引用其内部封装好的函数而已。
18.在XAMARIN编程中,在程序启动时,即布局时,若未寻找BTN,而定义了CLICK事件,则System.NullReferenceException: Object reference not set to an instance of an object. 即 注意各个内容不能为空。
19.C#中的DLL与WINDOWS中的DLL不一样,即托管类的DLL可以直接在C#工程中添加引用。而非托管类的只能用DLLIMPORT的标签等操作。目前理解如此。
20.没有添加wifi访问权限,则提示java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10088 nor current process has android.permission.READ_PHONE_STATE.
需要在manifest.xml中添加权限。且不同的权限需要分别添加。
21.要操作WIFI设备,需要先获取Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这个对象来管理WIFI设备。
22.2.使用SynchronizationContext的Post/Send方法更新
SynchronizationContext类在System.Threading命令空间下,可提供不带同步的自由线程上下文,其中Post方法签名如下:
public virtual void Post(SendOrPostCallback d,Object state) //将异步消息调度到一个同步上下文
可以看出我们要异步更新UI控件,第一是要获取UI线程的上下文了,第二就是调用post方法了,
SynchronizationContext _syncContext = null
;
//窗体构造函数
public
Form1()
{
InitializeComponent();
//获取UI线程同步上下文
_syncContext = SynchronizationContext.Current;
}
_syncContext.Post(SetLabelText,
"修改后的文本"
);
//子线程中通过UI线程上下文更新UI
23.addressList = Dns.GetHostAddresses( Dns.GetHostName() );获取的是一个数组,且正确的IPv4地址因网络的不同,及电脑配置的不同而在数组中的位置不同。在获取正确的IP地址时较为麻烦。但增加筛选条件后,则可以获得唯一值。
IPAddress addd = Dns.GetHostAddresses(name).Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First();
24."%"为取余号,不用多说。
"/"号现在整形运算是取整,浮点运算时为除法运算,如54/10结果为5,54.0/10.0结果为5.4而且取整时不进行四舍五入只取整数部分,如54/10和56/10是5.
Math.Celling()取整数的较大数,相当于不管余数是什么都会进一位。如Math.Celling(54.0/10.0)结果为6.
Math.Floor()取整数的较小数,相当于"/"号,即不管余数部分是什么都不进行进位。如Math.Floor(56.0/10.0)的结果是5.
代码如下: using System;
26. 在进行布局设置时,往往出现不能自动生成ID的现象,网上解释较多,主要观点有控件命名不规范,语法格式不正确,生成版本不对等等。因此,主要y原因仍不清晰,但通过重新布局可以解决相关问题,但重新布局时最好注意一下命名规范等,且注意问题开始前做了什么更改,以便进行逐步查找原因。而此次,我是在添加TEXTVIEW时,不能同时添加两个,不知在属性设置上有什么纰漏。
27.读写文件
var documentsPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);
//var p = System.Environment.GetFolderPath( System.Environment.SpecialFolder.Personal);
28.XAMARIN中TEXTVIEW换行问题:可以看到这样并没有实现换行,但是这里换行的关键点在于 需要将 android:inputType ="text" 改成 android:inputType="textMultiLine" ,并设置lines属性。
32.今天进行串口通讯时犯了一个逻辑上的小错误,即在串口发送指令前后线程休息的问题。正确的应该是在指令发送前进行休息有效,指令发送后休息往往无效,即达不到缓解通讯压力的目的,当然,也不是绝对的,主要看线程何时忙碌。
33.LinkAssemblies任务意外失败
两种解决办法:
1、将android options 中的linking属性设置为:none。
2、部署版本设置为sdk最新版本(最好随时更新sdk版本)
两种处理方式,一种直接卸载不好使的版本,然后再生成时就会自动选择其他版本的生成工具,不过毕竟人家生成工具并没有犯错,这样直接卸了真是。。。。所以小生选择了另一种处理方式,为项目指定生成工具,用文本编辑器打开项目的.csprj文件,在不含有任何Condition属性的PropertyGroup下添加AndroidSdkBuildToolsVersion节点,配置相应版本即可,如下:
1 <AndroidSdkBuildToolsVersion>23.0.3AndroidSdkBuildToolsVersion>
35.对于打包文件,目前在DEBUG模式可以暂时操作。若进行RELEASE操作,需要重新调配一下开发平台。
36.Excel中提供了“数据有效性”这样一个验证功能,可以设定输入的规则,如果输入的数据不符合规则则不允许录入。我们可以利用这个功能来实现让表格使用者只能填写或选择符合规则的内容,从而达到多人分别填写也能使表格内容标准化的目的。
2007版以后的数据有效性在功能区【数据】选项卡下的【数据有效性】按钮中。在数据有效性中,除了可以选择限制单元格输入内容外,还可以“圈释/清除无效数据”。
37.