国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

不同編程語言下CH347DLL的調(diào)用方法

這篇具有很好參考價值的文章主要介紹了不同編程語言下CH347DLL的調(diào)用方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

? ? ? ? CH347為一款USB轉(zhuǎn)JTAG/SPI/IIC/GPIO/UART接口的轉(zhuǎn)換芯片,此處總結(jié)一下開發(fā)時所遇到的在C/C++、Python、C#下調(diào)用CH347DLL的方法,若有其他需要補充的也可一起交流。

? ? ? ? 基于WCH官方Demo板做的代碼驗證。

1、C/C++調(diào)用

? ? ? ? 可參考WCH官網(wǎng)CH347EVT/Tools下工程代碼,此處則不再重復

2、Python調(diào)用

? ? ? ? 選擇Python調(diào)用時,需對應上Python和DLL是否都為32或64位,否則會出現(xiàn)調(diào)用失敗的情況,傳入API參數(shù)時則只需注意一下特殊的結(jié)構(gòu)體此類參函數(shù)即可。

'''
Author: OIDCAT
Date: 2022-07-13 15:22:17
LastEditTime: 2022-08-23 19:19:23
此處需注意Python版本位數(shù)與DLL是否匹配
'''

 #! /usr/bin/env python
 #coding=utf-8
import ctypes
import os
from ctypes import *

# 
print("進入程序")
CH347 = windll.LoadLibrary("./CH347DLL.DLL")
DevIndex = 0
I2C_addr = 0xA0
class spi_config(Structure):
        _fields_ = [
            ("iMode", c_ubyte),
            ("iClock", c_ubyte),
            ("iByteOrder", c_ubyte),
            ("iSpiWriteReadInterval", c_ushort),
            ("iSpiOutDefaultData",c_ubyte),
            ("iChipSelect", c_ulong),
            ("CS1Polarity",c_ubyte),  
            ("CS2Polarity", c_ubyte), 
            ("iIsAutoDeativeCS", c_ushort), 
            ("iActiveDelay", c_ushort), 
            ("iDelayDeactive", c_ulong),
        ]

def init():
    if CH347.CH347OpenDevice(DevIndex) != -1:
        print("CH347 Open succeeded")
        CH347.CH347I2C_Set(DevIndex, 3)

        CH347_SPI = spi_config()
        CH347_SPI.iMode = 0x03
        CH347_SPI.iClock = 0x01
        CH347_SPI.iByteOrder = 0x01
        CH347_SPI.iSpiOutDefaultData = 0xff 
        CH347_SPI.iChipSelect = 0x80
        CH347.CH347SPI_Init(DevIndex, CH347_SPI)
        # CH347.CH347CloseDevice(DevIndex)
    else:
        print("Open The CH347 Failed")
            
def read(addr):
    if CH347.CH347OpenDevice(DevIndex) != -1:
        oBuf = (c_byte *2)()
        iBuf = (c_byte *1)()
        oBuf[0] = 0xA0
        oBuf[1] = addr
        CH347.CH347StreamI2C(DevIndex, 2, oBuf, 1, iBuf)
        CH347.CH347CloseDevice(DevIndex)
        print("CH347 read succeeded")
        return iBuf[0] & 0xFF
    else:
        print("CH347I2C.CH347OpenDevice")
        return 0

def spi_readId(DevIndex):
    cmd_buf = (c_byte * 4)()
    len = 4
    cmd_buf[0] = 0x9F
    cmd_buf[1] = 0xFF
    cmd_buf[2] = 0xFF
    cmd_buf[3] = 0xFF
    
    CH347.CH347SPI_WriteRead(DevIndex, 0x80, len, cmd_buf)
    print("{0:x} {1:x} {2:x} {3:x}".format(cmd_buf[0], cmd_buf[1], cmd_buf[2], cmd_buf[3]))
    return cmd_buf[0] & 0xFF

if __name__ == "__main__":
    print("CH347 Test")
    init()
    read(0x02)
    spi_readId(DevIndex)

3、C#調(diào)用

? ? ? ? 使用C#比較麻煩的就是需要將頭文件重新?lián)Q格式,但實際上工作量并不是太大,其中結(jié)構(gòu)體需要注意其地址對齊。文章來源地址http://www.zghlxwxcb.cn/news/detail-595054.html

using System;

namespace CH347T_Develop
{
    using System.Runtime.InteropServices;
    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi, Size = 8)]
    public struct mUSB_SETUP_PKT
    {// USB控制傳輸?shù)慕㈦A段的數(shù)據(jù)請求包結(jié)構(gòu)
        [FieldOffset(0)]
        public byte mUspReqType;                // 00H 請求類型
        [FieldOffset(1)]
        public byte mUspRequest;                // 01H 請求代碼

        [FieldOffset(2)]
        public byte mUspValueLow;// 02H 值參數(shù)低字節(jié)
        [FieldOffset(3)]
        public byte mUspValueHigh;              // 03H 值參數(shù)高字節(jié)
        [FieldOffset(2)]
        public UInt16 mUspValue;                // 02H-03H 值參數(shù)

        [FieldOffset(4)]
        public byte mUspIndexLow;// 04H 索引參數(shù)低字節(jié)
        [FieldOffset(5)]
        public byte mUspIndexHigh;              // 05H 索引參數(shù)高字節(jié)
        [FieldOffset(4)]
        public UInt16 mUspIndex;                    // 04H-05H 索引參數(shù)
        [FieldOffset(6)]
        public UInt16 mLength;// 06H-07H 數(shù)據(jù)階段的數(shù)據(jù)長度
    }

    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public struct mWIN32_COMMAND_USB_SETUP_PKT
    {               // 定義WIN32命令接口結(jié)構(gòu)
        [FieldOffset(0)]
        public UInt32 mFunction; // 輸入時指定功能代碼或者管道號
        [FieldOffset(0)]
        public Int32 mStatus;                    // 輸出時返回操作狀態(tài)
        [FieldOffset(4)]
        public UInt32 mLength;                   // 存取長度,返回后續(xù)數(shù)據(jù)的長度
        [FieldOffset(8)]
        public mUSB_SETUP_PKT mSetupPkt;         // USB控制傳輸?shù)慕㈦A段的數(shù)據(jù)請求
    }

    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public struct mWIN32_COMMAND_mBuffer
    {// 定義WIN32命令接口結(jié)構(gòu)
        [FieldOffset(0)]
        public UInt32 mFunction;// 輸入時指定功能代碼或者管道號
        [FieldOffset(0)]
        public Int32 mStatus;// 輸出時返回操作狀態(tài)
        [FieldOffset(4)]
        public UInt32 mLength;// 存取長度,返回后續(xù)數(shù)據(jù)的長度

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = CH347DLL.mCH341_PACKET_LENGTH), FieldOffset(8)]
        public byte[] mBuffer;                // 數(shù)據(jù)緩沖區(qū),長度為0至255B
    }
    // 此處可能存在問題,待修改

    [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
    public struct DEV_INFOR
    {
        [FieldOffset(0)]
        public byte iIndex;                 // 當前打開序號

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64), FieldOffset(16)]
        public byte[] DevicePath;           // 設備鏈接名,用于CreateFile

        [FieldOffset(18)]
        public byte UsbClass;               // 0:CH347_USB_CH341, 2:CH347_USB_HID,3:CH347_USB_VCP

        [FieldOffset(19)]
        public byte FuncType;               // 0:CH347_FUNC_UART,1:CH347_FUNC_SPI_I2C,2:CH347_FUNC_JTAG_I2C

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64), FieldOffset(35)]
        public byte[] DeviceID;             // USB\VID_xxxx&PID_xxxx

        [FieldOffset(36)]
        public byte ChipMode;               // 芯片模式,0:Mode0(UART0/1); 1:Mode1(Uart1+SPI+I2C); 2:Mode2(HID Uart1+SPI+I2C) 3:Mode3(Uart1+Jtag+IIC)

        [FieldOffset(0)]
        IntPtr DevHandle;                   // 設備句柄

        [FieldOffset(0)]
        public UInt16 BulkOutEndpMaxSize;     // 上傳端點大小

        [FieldOffset(2)]
        public UInt16 BulkInEndpMaxSize;      // 下傳端點大小

        [FieldOffset(37)]
        public byte UsbSpeedType;           // USB速度類型,0:FS,1:HS,2:SS

        [FieldOffset(38)]
        public byte CH347IfNum;             // 設備接口號: 0:UART,1:SPI/IIC/JTAG/GPIO

        [FieldOffset(39)]
        public byte DataUpEndp;             // 端點地址

        [FieldOffset(40)]
        public byte DataDnEndp;             // 端點地址

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64), FieldOffset(56)]
        public byte[] ProductString;      // USB產(chǎn)品字符串

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64), FieldOffset(72)]
        public byte[] ManufacturerString; // USB廠商字符串

        [FieldOffset(0)]
        public UInt32 WriteTimeout;           // USB寫超時

        [FieldOffset(4)]
        public UInt32 ReadTimeout;            // USB讀超時

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64), FieldOffset(88)]
        public byte[] FuncDescStr;        // 接口功能描述符

        [FieldOffset(89)]
        public byte FirewareVer;            // 固件版本
    }

    class CH347DLL
    {
        public const int mCH341_PACKET_LENGTH = 64;

        public byte Index;

        // CH341端點地址
        public const int mCH347_ENDP_DATA_UP = 0x86;// CH347的數(shù)據(jù)塊上傳端點的地址
        public const int mCH347_ENDP_DATA_DOWN = 0x06;      // CH347的數(shù)據(jù)塊下傳端點的地址

        // 設備層接口提供的管道操作命令
        public const int mPipeDeviceCtrl = 0x00000004;      // CH347的綜合控制管道
        public const int mPipeDataUp = 0x00000006;          // CH347的數(shù)據(jù)塊上傳管道
        public const int mPipeDataDown = 0x00000007;        // CH347的數(shù)據(jù)塊下傳管道

        // 應用層接口的功能代碼
        public const int mFuncNoOperation = 0x00000000;     // 無操作
        public const int mFuncGetVersion = 0x00000001;      // 獲取驅(qū)動程序版本號
        public const int mFuncGetConfig = 0x00000002;       // 獲取USB設備配置描述符
        public const int mFuncSetTimeout = 0x00000009;      // 設置USB通訊超時
        public const int mFuncSetExclusive = 0x0000000b;    // 設置獨占使用
        public const int mFuncResetDevice = 0x0000000c;     // 復位USB設備
        public const int mFuncResetPipe = 0x0000000d;       // 復位USB管道
        public const int mFuncAbortPipe = 0x0000000e;       // 取消USB管道的數(shù)據(jù)請求
        public const int mFuncBufferMode = 0x00000020;      // 設定緩沖上傳模式及查詢緩沖區(qū)中的數(shù)據(jù)長度
        public const int mFuncBufferModeDn = 0x00000021;    // 設定緩沖下傳模式及查詢緩沖區(qū)中的數(shù)據(jù)長度
        public const int mFuncGetVersionEx = 0x00000022;    // 獲取驅(qū)動程序版本號及芯片型號
                                                            // USB設備標準請求代碼
        public const int mUSB_CLR_FEATURE = 0x01;
        public const int mUSB_SET_FEATURE = 0x03;
        public const int mUSB_GET_STATUS = 0x00;
        public const int mUSB_SET_ADDRESS = 0x05;
        public const int mUSB_GET_DESCR = 0x06;
        public const int mUSB_SET_DESCR = 0x07;
        public const int mUSB_GET_CONFIG = 0x08;
        public const int mUSB_SET_CONFIG = 0x09;
        public const int mUSB_GET_INTERF = 0x0a;
        public const int mUSB_SET_INTERF = 0x0b;
        public const int mUSB_SYNC_FRAME = 0x0c;

        // CH341控制傳輸?shù)膹S商專用請求類型
        public const int mCH341_VENDOR_READ = 0xC0;         // 通過控制傳輸實現(xiàn)的CH341廠商專用讀操作
        public const int mCH341_VENDOR_WRITE = 0x40;        // 通過控制傳輸實現(xiàn)的CH341廠商專用寫操作
        public const int mCH341A_CMD_I2C_STREAM = 0xAA;     // I2C接口的命令包,從次字節(jié)開始為I2C命令流
        public const int mCH341A_CMD_UIO_STREAM = 0xAB;     // UIO接口的命令包,從次字節(jié)開始為命令流
        public const int mCH341A_CMD_PIO_STREAM = 0xAE;     // PIO接口的命令包,從次字節(jié)開始為數(shù)據(jù)流
                                                            // CH341A控制傳輸?shù)膹S商專用請求代碼
        public const int mCH341A_BUF_CLEAR = 0xB2;          // 清除未完成的數(shù)據(jù)
        public const int mCH341A_I2C_CMD_X = 0x54;          // 發(fā)出I2C接口的命令,立即執(zhí)行
        public const int mCH341A_DELAY_MS = 0x5E;           // 以亳秒為單位延時指定時間
        public const int mCH341A_GET_VER = 0x5F;            // 獲取芯片版本

        public const int mCH341A_CMD_I2C_STM_STA = 0x74;    // I2C接口的命令流:產(chǎn)生起始位
        public const int mCH341A_CMD_I2C_STM_STO = 0x75;    // I2C接口的命令流:產(chǎn)生停止位
        public const int mCH341A_CMD_I2C_STM_OUT = 0x80;    // I2C接口的命令流:輸出數(shù)據(jù),位5-位0為長度,后續(xù)字節(jié)為數(shù)據(jù),0長度則只發(fā)送一個字節(jié)并返回應答
        public const int mCH341A_CMD_I2C_STM_IN = 0xC0;     // I2C接口的命令流:輸入數(shù)據(jù),位5-位0為長度,0長度則只接收一個字節(jié)并發(fā)送無應答
        public const int mCH341A_CMD_I2C_STM_MAX = ((0x3F < mCH341_PACKET_LENGTH) ? 0x3F : mCH341_PACKET_LENGTH);// I2C接口的命令流單個命令輸入輸出數(shù)據(jù)的最大長度
        public const int mCH341A_CMD_I2C_STM_SET = 0x60;    // I2C接口的命令流:設置參數(shù),位2=SPI的I/O數(shù)(0=單入單出,1=雙入雙出),位1位0=I2C速度(00=低速,01=標準,10=快速,11=高速)
        public const int mCH341A_CMD_I2C_STM_US = 0x40;     // I2C接口的命令流:以微秒為單位延時,位3-位0為延時值
        public const int mCH341A_CMD_I2C_STM_MS = 0x50;     // I2C接口的命令流:以亳秒為單位延時,位3-位0為延時值
        public const int mCH341A_CMD_I2C_STM_DLY = 0x0F;    // I2C接口的命令流單個命令延時的最大值
        public const int mCH341A_CMD_I2C_STM_END = 0x00;    // I2C接口的命令流:命令包提前結(jié)束

        public const int mCH341A_CMD_UIO_STM_IN = 0x00;     // UIO接口的命令流:輸入數(shù)據(jù)D7-D0
        public const int mCH341A_CMD_UIO_STM_DIR = 0x40;    // UIO接口的命令流:設定I/O方向D5-D0,位5-位0為方向數(shù)據(jù)
        public const int mCH341A_CMD_UIO_STM_OUT = 0x80;    // UIO接口的命令流:輸出數(shù)據(jù)D5-D0,位5-位0為數(shù)據(jù)
        public const int mCH341A_CMD_UIO_STM_US = 0xC0;     // UIO接口的命令流:以微秒為單位延時,位5-位0為延時值
        public const int mCH341A_CMD_UIO_STM_END = 0x20;    // UIO接口的命令流:命令包提前結(jié)束

        public const int MAX_DEVICE_PATH_SIZE = 128;        // 設備名稱的最大字符數(shù)
        public const int MAX_DEVICE_ID_SIZE = 64;           // 設備ID的最大字符數(shù)

        //驅(qū)動接口
        public const int CH347_USB_VENDOR = 0;
        public const int CH347_USB_HID = 2;
        public const int CH347_USB_VCP = 3;

        //CH347_USB_VENDOR支持CH341/7
        public const int CHIP_TYPE_CH341 = 0;
        public const int CHIP_TYPE_CH347 = 1;

        //芯片功能接口號
        public const int CH347_FUNC_UART = 0;
        public const int CH347_FUNC_SPI_IIC = 1;
        public const int CH347_FUNC_JTAG_IIC = 2;

        public const int DEFAULT_READ_TIMEOUT = 500;        //默認讀超時毫秒數(shù)
        public const int DEFAULT_WRITE_TIMEOUT = 500;       //默認寫超時毫秒數(shù)

        public const int mCH347_PACKET_LENGTH = 512;    // CH347支持的數(shù)據(jù)包的長度

        private const string CH347_DLL = "CH347DLL.DLL";
        /// <summary>
        /// HANDLE WINAPI CH347OpenDevice(ULONG DevI);
        /// </summary>
        /// <param name="Index"></param>
        /// <returns></returns>
        [DllImport("CH347DLL.DLL", EntryPoint = "CH347OpenDevice")]
        public static extern IntPtr CH347OpenDevice(UInt32 Index);

        [DllImport("CH347DLL.DLL", EntryPoint = "CH347CloseDevice")]
        public static extern IntPtr CH347CloseDevice(UInt32 Index);

        [DllImport("CH347DLL.DLL", EntryPoint = "CH347Uart_Open")]
        public static extern IntPtr CH347Uart_Open(UInt32 Index);

        [DllImport("CH347DLL.DLL", EntryPoint = "CH347Uart_Close")]
        public static extern IntPtr CH347Uart_Close(UInt32 Index);

        [DllImport("CH347DLL.DLL", EntryPoint = "CH347GetDeviceInfor")]
        public static extern IntPtr CH347GetDeviceInfor(UInt32 Index,
            ref DEV_INFOR info);

        [DllImport("CH347DLL.DLL", EntryPoint = "CH347GPIO_Get")]
        public static extern IntPtr CH347GPIO_Get(UInt32 Index,
            ref UInt16 iDir,
            ref UInt16 iData);

        [DllImport("CH347DLL.DLL", EntryPoint = "CH347GPIO_Set")]
        public static extern IntPtr CH347GPIO_Set(UInt32 Index,
            UInt32 iEnable,
            UInt32 iSetDirOut,
            UInt32 iSetDataOut);
    }
}

到了這里,關于不同編程語言下CH347DLL的調(diào)用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • python環(huán)境解析任意編程語言 tree-sitter使用方法(1)

    我個人目前仍在研究代碼有關的知識。目前基于深度學習表征代碼的論文越來越卷了,用到的工具越來越高級了。目前有一個開源項目tree-sitter,專門用于解析 具體語法樹 ,聲稱: 足夠通用 ,能用于任何編程語言 足夠迅速 ,能在文本編輯器中響應每一個用戶輸入 足夠魯棒

    2024年02月09日
    瀏覽(21)
  • 對比編程語言的四種錯誤處理方法,哪種才是最優(yōu)方案?

    作者:Andrea Bergia 譯者:豌豆花下貓@Python貓 英文:Error handling patterns 轉(zhuǎn)載請保留作者及譯者信息! 錯誤處理是編程的一個基本要素。除非你寫的是“hello world”,否則就必須處理代碼中的錯誤。在本文中,我將討論各種編程語言在處理錯誤時使用的最常見的四種方法,并分析

    2024年02月03日
    瀏覽(19)
  • C語言編程技巧 全局變量在多個c文件中公用的方法

    在使用C語言編寫程序時,經(jīng)常會遇到這樣的情況:我們希望在頭文件中定義一個全局變量,并將其包含在兩個不同的C文件中,以便這個全局變量可以在這兩個文件中共享。舉個例子,假設項目文件夾\\\"project\\\"下有三個文件:main.c、common.c和common.h。在這種情況下,我們希望聲明

    2024年02月14日
    瀏覽(19)
  • CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104 Linux串口驅(qū)動使用教程

    CH342/CH343/CH344/CH347/CH9101/CH9102/CH9103/CH9104 Linux串口驅(qū)動使用教程

    CH343 Linux串口驅(qū)動 ch343ser_linux 支持USB轉(zhuǎn)串口芯片?ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104等 ,同時該驅(qū)動配合ch343_lib庫還提供了芯片GPIO接口的讀寫功能,內(nèi)部EEPROM的信息配置和讀取功能等。 芯片型號 串口數(shù)量 GPIO數(shù)量 CH342F/K 2 CH342F:12 CH343G/P/K 1 — CH344Q/L 4 CH344Q:16 CH344L:

    2024年02月13日
    瀏覽(29)
  • XILINX-FPGA下載工具--CH347FPGADownloader

    XILINX-FPGA下載工具--CH347FPGADownloader

    ????????CH347FPGADownloader是一款專用于CH347的FPGA下載軟件,結(jié)合OpenOCD開源項目實現(xiàn)。 ????????當前支持FPGA型號主要以xilinx為主,其中具體型號如下: ? ? ? ? ? 使用中若遇到問題,可郵件咨詢:tech@wch.cn ? ? ????????1.“選擇FPGA型號”:選擇本次進行操作的FPGA型

    2024年02月07日
    瀏覽(85)
  • GO編程語言:簡潔、高效、強大的開源編程語言

    GO編程語言:簡潔、高效、強大的開源編程語言

    在現(xiàn)代軟件開發(fā)領域,隨著應用復雜度的不斷提升,開發(fā)人員對編程語言的需求也日益增長。GO編程語言,作為一種簡潔、高效且具備強大并發(fā)能力的新型開源編程語言,逐漸成為了許多開發(fā)者的首選。本文將詳細介紹GO語言在哪些項目開發(fā)中表現(xiàn)出色,以及為什么許多開發(fā)者

    2024年02月02日
    瀏覽(173)
  • 一起來做個CH347的項目(應用于FPGA、CPLD、MCU)

    ????????國產(chǎn)CH347芯片自從出現(xiàn)在大眾視野,就展開了很多討論。四種工作模式,多接口可同時使用,如下表: 接口模式 接口功能 Mode-0 480Mbps高速USB轉(zhuǎn)雙UART(Baudrate最高9Mbps) Mode-1 480Mbps高速USB轉(zhuǎn)UART+SPI+I2C(廠商驅(qū)動模式) Mode-2 480Mbps高速USB轉(zhuǎn)UART+SPI+I2C(系統(tǒng)HID驅(qū)動模式)

    2024年02月09日
    瀏覽(18)
  • 【編程語言 · C語言 · 函數(shù)指針】

    由于指針可以指向任何存儲器位置中的地址,因此它們也可以指向可執(zhí)行代碼的開頭。 函數(shù)指針或函數(shù)指針指向內(nèi)存中函數(shù)的可執(zhí)行代碼。函數(shù)指針可以存儲在數(shù)組中,也可以作為參數(shù)傳遞給其他函數(shù)。 函數(shù)指針聲明使用 * 就像使用任何指針一樣: (*func_name)? 周圍的括號很

    2024年02月10日
    瀏覽(26)
  • 介紹一些編程語言— Perl 語言

    Perl 是一種動態(tài)解釋型的腳本語言。 最初的設計者為拉里?沃爾,它于 1987 1987 1987 年 12 12 12 月 18 18 18 日發(fā)表。Perl 借取了 C、sed、awk、shell scripting 以及很多其他編程語言的特性。其中最重要的特性是他內(nèi)部集成了正則表達式的功能,以及巨大的第三方代碼庫 CPAN。 1987 1987

    2024年02月12日
    瀏覽(27)
  • 介紹一些編程語言—C語言

    介紹一些編程語言—C語言

    C 語言是一門 面向過程 的計算機編程語言,與 C++、C#、Java 等面向?qū)ο缶幊陶Z言有所不同。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、僅產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。 C語言描述問題比匯編語言迅速、工作量小

    2024年02月13日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包