用C#怎么写UART、SPI、I2C、CAN总线上测试时的数据程序?

如题所述

第1个回答  2018-02-24
针对 树莓派 封装的 UWP应用 类,以下代码未经测试,聊以抛砖引玉:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Devices.Gpio;
using Windows.Storage.Streams;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using Windows.Devices.I2c;
using Windows.Devices.Spi;
namespace SlotAgentApp.Services
{
public class DevicesHelper
{
public static void GPIO(int eLevel=0, int ioPortNumber = 5)
{
// 获得系统板载缺省GPIO controller
GpioController gpio = GpioController.GetDefault();
if (gpio == null)
return; // 如果系统板载无可用GPIO,则返回
// 打开指定的GPIO
using (GpioPin pin = gpio.OpenPin(ioPortNumber))
{
// Latch HIGH value first. This ensures a default value when the pin is set as output
pin.Write(eLevel==0? GpioPinValue.Low: GpioPinValue.High);
// 设置IO为输出方向
pin.SetDriveMode(GpioPinDriveMode.Output);
} //关闭 pin - will revert to its power-on state
}
#region 示例代码
/*
(一)GPIO接口使用
*/
public void GPIO()
{
// Get the default GPIO controller on the system
GpioController gpio = GpioController.GetDefault();
if (gpio == null)
return; // GPIO not available on this system
// Open GPIO 5
using (GpioPin pin = gpio.OpenPin(5))
{
// Latch HIGH value first. This ensures a default value when the pin is set as output
pin.Write(GpioPinValue.High);
// Set the IO direction as output
pin.SetDriveMode(GpioPinDriveMode.Output);
} // Close pin - will revert to its power-on state
}
/*
(二) UART接口
Pin 8 - UART0 TX
Pin 10- UART0 RX
下面的例子先是初始化UART0,然后做了一次读操作和一次写操作
*/
public async void Serial()
{
string aqs = SerialDevice.GetDeviceSelector("UART0"); /* Find the selector string for the serial device */
var dis = await DeviceInformation.FindAllAsync(aqs); /* Find the serial device with our selector string */
SerialDevice SerialPort = await SerialDevice.FromIdAsync(dis[0].Id); /* Create an serial device with our selected device */
/* Configure serial settings */
SerialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
SerialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
SerialPort.BaudRate = 9600;
SerialPort.Parity = SerialParity.None;
SerialPort.StopBits = SerialStopBitCount.One;
SerialPort.DataBits = 8;
/* Write a string out over serial */
string txBuffer = "Hello Serial";
DataWriter dataWriter = new DataWriter();
dataWriter.WriteString(txBuffer);
uint bytesWritten = await SerialPort.OutputStream.WriteAsync(dataWriter.DetachBuffer());
/* Read data in from the serial port */
const uint maxReadLength = 1024;
DataReader dataReader = new DataReader(SerialPort.InputStream);
uint bytesToRead = await dataReader.LoadAsync(maxReadLength);
string rxBuffer = dataReader.ReadString(bytesToRead);
}
/*
使用上面的例子时,需要在Package.appxmanifest 中修改下权限修改如下
<Capabilities>
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
</Capabilities>
*/
/*
(三)I2C 总线
Pin 3 - I2C1 SDA
Pin 5 - I2C1 SCL
下面的例子首先初始化I2C1 然后向地址为0x40的I2C设备写数据
*/
public async void I2C()
{
// Get a selector string for bus "I2C1"
string aqs = I2cDevice.GetDeviceSelector("I2C1");
// Find the I2C bus controller with our selector string
var dis = await DeviceInformation.FindAllAsync(aqs);
if (dis.Count == 0)
return; // bus not found
// 0x40 is the I2C device address
var settings = new I2cConnectionSettings(0x40);
// Create an I2cDevice with our selected bus controller and I2C settings
using (I2cDevice device = await I2cDevice.FromIdAsync(dis[0].Id, settings))
{
byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
device.Write(writeBuf);
}
}
/*
(四) SPI 总线
Pin 19 - SPI0 MOSI
Pin 21 - SPI0 MISO
Pin 23 - SPI0 SCLK
Pin 24 - SPI0 CS0
Pin 26 - SPI0 CS1
下面的例子向SPI0 做了一次写操作
*/
public async void SPI()
{
// Get a selector string for bus "SPI0"
string aqs = SpiDevice.GetDeviceSelector("SPI0");
// Find the SPI bus controller device with our selector string
var dis = await DeviceInformation.FindAllAsync(aqs);
if (dis.Count == 0) ;
return; // "SPI0" not found on this system
// Use chip select line CS0
var settings = new SpiConnectionSettings(0);
// Create an SpiDevice with our bus controller and SPI settings
using (SpiDevice device = await SpiDevice.FromIdAsync(dis[0].Id, settings))
{
byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
device.Write(writeBuf);
}
}
#endregion
}
}
第2个回答  2016-09-08
C# 如何控制这些总线?

用C#怎么写UART、SPI、I2C、CAN总线上测试时的数据程序?
(二) UART接口 Pin 8 - UART0 TX Pin 10- UART0 RX 下面的例子先是初始化UART0,然后做了一次读操作和一次写操作 \/ public async void Serial(){ string aqs = SerialDevice.GetDeviceSelector("UART0"); \/* Find the selector string for the serial device *\/ var dis = await...

STM32的串行通信接口(UART、SPI、I2C)详解与应用
1. UART,通用异步收发器,用于点对点传输数据,通常使用两个信号线:TX(发送)和RX(接收)进行通信。在STM32中,配置UART通信相对简单,首先需将引脚设置为UART功能,然后配置波特率、数据位、停止位和校验位等参数。使用相关API,如`USART_SendData()`和`USART_ReceiveData()`进行数据发送和接收。2. ...

IIC、SPI、USART、RS485、RS232、CAN外设通信总结
UART在发送数据时,会将并行数据转换为串行数据;接收数据时,将串行数据转换为并行数据。同步串行通信(Synchronous serial communication)如I2C、SPI等,需要时钟信号进行数据同步;而异步串行通信(Asynchronous serial communication),如UART,不需要时钟信号,数据的传输速率依赖于通信设备的约定。串行通信标准...

常见硬件通信(SPI、I2C、CAN、USB、UART)协议介绍
SPI允许单位数据传输,灵活且控制性强,但缺乏流控制和应答机制。I2C (Inter-Integrated Circuit): 一种简单的双向同步串行总线,仅需两根线。I2C以主从交互方式传输数据,主设备控制时钟,允许双向数据交换,具有寻址和数据传输控制的特点,但同样没有流控制。CAN (Controller Area Network): 实现实时应用的...

嵌入式5大常用协议超全整理(UART、RS232、RS485、IIC、SPI)~
1. IIC总线简介:I2C总线由飞利浦公司提出,用于连接低速周边外部设备。主要用途为SOC与周边外设间的通信,如EEPROM、电容触摸芯片、各种Sensor等。2. 物理接口:I2C总线仅使用两条双向漏极开路信号线(SDA、SCL),并有电阻上拉。总线支持多种传输速率,包括标准模式、低速模式、快速模式及高速模式。3. ...

三种通信模式SPI、UART、I2C它们的工作原理
数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少。数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快。在多机通信上面用的最多。SPI:高速同步串行口。3~4线接口,收发独立、可同步进行UART:通用异步串行口。

单片机中如何选用SPI、UART和IIC\/SmBus?有谁知道他们的传输速度和应用场...
4、CAN:现场总线WiFi模块常用通信接口包含:USB、SDIO、SPI(slave)、UART、RGMII、RMII。5、首先,单片机程序和SPI总线I2C总线不是一个范畴的概念SPI总线和I2C总线是硬件总线,其存在性只能在硬件范畴中体现,一些型号的单片机本身就同时具有以上两种总线,有的存在其中一种,有的则没有。6、STC的很多...

终于搞清了:SPI、UART、I2C通信的区别与应用
I2C(Inter-Integrated Circuit)协议是另一种简单、双向的二线制同步串行总线,适用于连接多个从设备到单个主机。它使用SDA(数据)和SCL(时钟)线,允许多个微控制器记录数据到单个存储卡或将文本显示到单个LCD。每种通信协议都有其优点和缺点。SPI传输速度快,但需要四根线,且无数据校验机制。UART仅...

单片机通信中SPI、I2C、UART三种总线有什么异同
在单片机通信中,SPI、I2C和UART是三种常见的总线接口,各有其特点和应用场景。首先,让我们从通信方式上区分:串行通信包括SPI和UART,它们都支持单工、半双工和全双工。SPI是一种全双工同步通信,以主从模式工作,通常只有一个主机和多个从机,使用四根线,包括时钟、数据输入、数据输出和片选信号。它的...

三种通信模式SPI、UART、I2C它们的工作原理
I2C总线按字节传输,即每次传输8bits二进制数据,传输完毕后等待接收端的应答信号ACK,收到应答信号后再传输下一字节。等不到ACK信号后,传输终止。空闲情况下,SCL和SDA都处于高电平状态。UART通信 UART:Universal Asynchronous Receiver\/Transmitter,通用异步接收\/发送装置。UART首先将并行数据转换成串行数据来...

相似回答