`
kavy
  • 浏览: 900434 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

FIX tutorial in Java with QuickFIX/j simple example

 
阅读更多

http://www.tuicool.com/articles/v2me6r

 

 

Q. What is

FIX

Protocol?

 

A. FIX stands for Financial Information eXchange, which is an open protocol intended to streamline electronic communications in the financial securities industry. Most of the exchanges use this standard for communication like sending Order, Executions, MarketData, etc. There are many versions of the specifications like 4.2, 4.4, etc. Have a look at https://fixspec.com/FIX44.

Let's have a look at

QuickFIX/J

and Java example for sending and recieving FIX messages.

 

Step 1 : Required dependency JAR files

Step 2 : The quickfixj-msg-fix44-1.5.3.jar contains the data dictionary for FIX4.4 with domain objects like and XML "NewSingleOrder". Extract FIX44.xml and copy it to c:\\temp.

Step 3 : Define the configuration for the receiver or message acceptor. receiver.cfg file in /conf. Needs to be in the classpath.

[DEFAULT]
ConnectionType=acceptor
SocketAcceptPort=5001
SocketReuseAddress=Y
StartTime=00:00:00
EndTime=00:00:00
FileLogPath=log
FileStorePath=c:\\temp

[SESSION]
BeginString=FIX.4.4
SenderCompID=FixServer
TargetCompID=CLIENT1
DataDictionary=c:\\temp\\FIX44.xml

Step 4 : Define the FIXReceiver class. It extends MessageCracker implements Application . Relevant method gets invoked in this event driven architecture used in MINA.

package com.example;

import quickfix.Application;
import quickfix.DoNotSend;
import quickfix.FieldNotFound;
import quickfix.IncorrectDataFormat;
import quickfix.IncorrectTagValue;
import quickfix.Message;
import quickfix.RejectLogon;
import quickfix.SessionID;
import quickfix.UnsupportedMessageType;
import quickfix.fix44.MessageCracker;
import quickfix.fix44.NewOrderSingle;

public class FIXReceiver extends MessageCracker implements Application {

 @Override
 public void onMessage(NewOrderSingle order, SessionID sessionID) {
  System.out.println("Receiver onMessage..  " + order); 
 }
 
 @Override
 public void fromAdmin(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat,
  IncorrectTagValue, RejectLogon {
 }

 @Override
 public void fromApp(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat, 
 IncorrectTagValue, UnsupportedMessageType {
  System.out.println("Receiver fromApp..  " + arg0);
  crack(arg0, arg1); // calls onMessage(..,..)
 }

 @Override
 public void onCreate(SessionID arg0) {
  System.out.println("Receiver onCreate.. " + arg0);
 }

 @Override
 public void onLogon(SessionID arg0) {
  System.out.println("Receiver onLogon.." + arg0);
 }

 @Override
 public void onLogout(SessionID arg0) {}

 @Override
 public void toAdmin(Message arg0, SessionID arg1) {}

 @Override
 public void toApp(Message arg0, SessionID arg1) throws DoNotSend {}
}

Step 5 : The server socket code to receive messages. ReceiverApp.Java

package com.example;

import java.util.Scanner;

import quickfix.Application;
import quickfix.ConfigError;
import quickfix.DefaultMessageFactory;
import quickfix.FileStoreFactory;
import quickfix.ScreenLogFactory;
import quickfix.SessionSettings;
import quickfix.SocketAcceptor;

public class RecieverApp {
 public static void main(String[] args) throws ConfigError {
  
  SessionSettings settings = new SessionSettings("receiver.cfg");
  Application myApp = new FIXReceiver();
  FileStoreFactory fileStoreFactory = new FileStoreFactory(settings);
  ScreenLogFactory screenLogFactory = new ScreenLogFactory(settings);
  DefaultMessageFactory msgFactory = new DefaultMessageFactory();
  SocketAcceptor acceptor = new SocketAcceptor(myApp, fileStoreFactory,
    settings, screenLogFactory, msgFactory);
  
  acceptor.start();
  
  Scanner reader = new Scanner(System.in);
  System.out.println("press <enter> to quit");
  
  //get user input for a
  reader.nextLine();
  
  acceptor.stop();
 }

}

Step 5 : The sender or initiator configuration file sender.cfg .

[DEFAULT]
ConnectionType=initiator
HeartBtInt=30
ReconnectInterval=0
FileStorePath=c:\\temp
FileLogPath=log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=N
SocketConnectHost=localhost
ContinueInitializationOnError=Y

[SESSION]
BeginString=FIX.4.4
SenderCompID=CLIENT1
TargetCompID=FixServer
SocketConnectPort=5001

Step 6 : Define the FixSender class that implements Application . Relevant method gets invoked in this event driven architecture used in MINA.

package com.example;

import quickfix.Application;
import quickfix.DoNotSend;
import quickfix.FieldNotFound;
import quickfix.IncorrectDataFormat;
import quickfix.IncorrectTagValue;
import quickfix.Message;
import quickfix.RejectLogon;
import quickfix.SessionID;
import quickfix.UnsupportedMessageType;

public class FIXSender implements Application {

 @Override
 public void fromAdmin(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat, 
 IncorrectTagValue, RejectLogon {
 }

 @Override
 public void fromApp(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat, 
         IncorrectTagValue, UnsupportedMessageType { }

 @Override
 public void onCreate(SessionID arg0) {}

 @Override
 public void onLogon(SessionID arg0) {}

 @Override
 public void onLogout(SessionID arg0) {}

 @Override
 public void toAdmin(Message arg0, SessionID arg1) {}

 @Override
 public void toApp(Message msg, SessionID sessionId) throws DoNotSend {
  System.out.println("Sender toApp: " + msg.toString());
 }
}

Step 7 : The client socket initiator to send FIX messages. SenderApp.java .

package com.example;

import java.util.Date;

import quickfix.Application;
import quickfix.ConfigError;
import quickfix.DefaultMessageFactory;
import quickfix.FileStoreFactory;
import quickfix.ScreenLogFactory;
import quickfix.Session;
import quickfix.SessionID;
import quickfix.SessionNotFound;
import quickfix.SessionSettings;
import quickfix.SocketInitiator;
import quickfix.field.ClOrdID;
import quickfix.field.OrdType;
import quickfix.field.OrderQty;
import quickfix.field.Price;
import quickfix.field.Side;
import quickfix.field.Symbol;
import quickfix.field.TransactTime;
import quickfix.fix44.NewOrderSingle;

public class SenderApp {

 public static void main(String[] args) throws ConfigError, InterruptedException, SessionNotFound {

  SessionSettings settings = new SessionSettings("sender.cfg");
  Application myApp = new FIXSender();
  FileStoreFactory fileStoreFactory = new FileStoreFactory(settings);
  ScreenLogFactory screenLogFactory = new ScreenLogFactory(settings);
  DefaultMessageFactory msgFactory = new DefaultMessageFactory();
  SocketInitiator initiator = new SocketInitiator(myApp, fileStoreFactory, settings, 
                                       screenLogFactory, msgFactory);

  initiator.start();

  Thread.sleep(3000);

  // matching values from sender.cfg
  SessionID sessionID = new SessionID("FIX.4.4", "CLIENT1", "FixServer");
  NewOrderSingle order = new NewOrderSingle(new ClOrdID("DLF"), new Side(Side.BUY), 
    new TransactTime(new Date()), new OrdType(OrdType.LIMIT));

  order.set(new OrderQty(45.00));
  order.set(new Price(25.40));
  order.set(new Symbol("BHP"));
  Session.sendToTarget(order, sessionID);
  
  Thread.sleep(60000);

  initiator.stop();
 }
}

Step 8 : Run the ReceiverApp .

log4j:WARN No appenders could be found for logger (quickfix.SessionSchedule).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
<20140731-01:59:36, FIX.4.4:FixServer->CLIENT1, event> (Session FIX.4.4:FixServer->CLIENT1 schedule is daily, 00:00:00-UTC - 00:00:00-UTC)
<20140731-01:59:36, FIX.4.4:FixServer->CLIENT1, event> (Created session: FIX.4.4:FixServer->CLIENT1)
Receiver onCreate.. FIX.4.4:FixServer->CLIENT1
press <enter> to quit


Step 9 : Run the SenderApp .

log4j:WARN No appenders could be found for logger (quickfix.SessionSchedule).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
<20140731-01:59:44, FIX.4.4:CLIENT1->FixServer, event> (Session FIX.4.4:CLIENT1->FixServer schedule is daily, 00:00:00-UTC - 00:00:00-UTC)
<20140731-01:59:44, FIX.4.4:CLIENT1->FixServer, event> (Created session: FIX.4.4:CLIENT1->FixServer)
<20140731-01:59:45, FIX.4.4:CLIENT1->FixServer, outgoing> (8=FIX.4.4 9=72 35=A 34=52 49=CLIENT1 52=20140731-01:59:45.635 56=FixServer 98=0 108=30 10=203 )
<20140731-01:59:45, FIX.4.4:CLIENT1->FixServer, event> (Initiated logon request)
<20140731-01:59:45, FIX.4.4:CLIENT1->FixServer, incoming> (8=FIX.4.4 9=72 35=A 34=41 49=FixServer 52=20140731-01:59:45.672 56=CLIENT1 98=0 108=30 10=202 )
<20140731-01:59:45, FIX.4.4:CLIENT1->FixServer, event> (Received logon)
Sender toApp: 8=FIX.4.4 9=123 35=D 34=53 49=CLIENT1 52=20140731-01:59:47.671 56=FixServer 11=DLF 38=45 40=2 44=25.4 54=1 55=BHP 60=20140731-01:59:47.669 10=238 
<20140731-01:59:47, FIX.4.4:CLIENT1->FixServer, outgoing> (8=FIX.4.4 9=123 35=D 34=53 49=CLIENT1 52=20140731-01:59:47.671 56=FixServer 11=DLF 38=45 40=2 44=25.4 54=1 55=BHP 60=20140731-01:59:47.669 10=238 )
<20140731-02:00:15, FIX.4.4:CLIENT1->FixServer, incoming> (8=FIX.4.4 9=60 35=0 34=42 49=FixServer 52=20140731-02:00:15.918 56=CLIENT1 10=145 )
<20140731-02:00:18, FIX.4.4:CLIENT1->FixServer, outgoing> (8=FIX.4.4 9=60 35=0 34=54 49=CLIENT1 52=20140731-02:00:18.604 56=FixServer 10=143 )
<20140731-02:00:46, FIX.4.4:CLIENT1->FixServer, incoming> (8=FIX.4.4 9=60 35=0 34=43 49=FixServer 52=20140731-02:00:46.916 56=CLIENT1 10=148 )
<20140731-02:00:48, FIX.4.4:CLIENT1->FixServer, event> (Initiated logout request)
<20140731-02:00:48, FIX.4.4:CLIENT1->FixServer, outgoing> (8=FIX.4.4 9=60 35=5 34=55 49=CLIENT1 52=20140731-02:00:48.603 56=FixServer 10=151 )
<20140731-02:00:48, FIX.4.4:CLIENT1->FixServer, incoming> (8=FIX.4.4 9=60 35=5 34=44 49=FixServer 52=20140731-02:00:48.607 56=CLIENT1 10=153 )
<20140731-02:00:48, FIX.4.4:CLIENT1->FixServer, error> (quickfix.SessionException Logon state is not valid for message (MsgType=5))
<20140731-02:00:48, FIX.4.4:CLIENT1->FixServer, event> (Already disconnected: Verifying message failed: quickfix.SessionException: Logon state is not valid for message (MsgType=5))


Step 10: The receiver or acceptor logs grow further to

<20140731-01:59:45, FIX.4.4:FixServer->CLIENT1, incoming> (8=FIX.4.4 9=72 35=A 34=52 49=CLIENT1 52=20140731-01:59:45.635 56=FixServer 98=0 108=30 10=203 )
<20140731-01:59:45, FIX.4.4:FixServer->CLIENT1, event> (Accepting session FIX.4.4:FixServer->CLIENT1 from /127.0.0.1:60832)
<20140731-01:59:45, FIX.4.4:FixServer->CLIENT1, event> (Acceptor heartbeat set to 30 seconds)
<20140731-01:59:45, FIX.4.4:FixServer->CLIENT1, event> (Received logon)
<20140731-01:59:45, FIX.4.4:FixServer->CLIENT1, event> (Responding to Logon request)
<20140731-01:59:45, FIX.4.4:FixServer->CLIENT1, outgoing> (8=FIX.4.4 9=72 35=A 34=41 49=FixServer 52=20140731-01:59:45.672 56=CLIENT1 98=0 108=30 10=202 )
Receiver onLogon..FIX.4.4:FixServer->CLIENT1
<20140731-01:59:47, FIX.4.4:FixServer->CLIENT1, incoming> (8=FIX.4.4 9=123 35=D 34=53 49=CLIENT1 52=20140731-01:59:47.671 56=FixServer 11=DLF 38=45 40=2 44=25.4 54=1 55=BHP 60=20140731-01:59:47.669 10=238 )
Receiver fromApp..  8=FIX.4.4 9=123 35=D 34=53 49=CLIENT1 52=20140731-01:59:47.671 56=FixServer 11=DLF 38=45 40=2 44=25.4 54=1 55=BHP 60=20140731-01:59:47.669 10=238 
Receiver onMessage..  8=FIX.4.4 9=123 35=D 34=53 49=CLIENT1 52=20140731-01:59:47.671 56=FixServer 11=DLF 38=45 40=2 44=25.4 54=1 55=BHP 60=20140731-01:59:47.669 10=238 
<20140731-02:00:15, FIX.4.4:FixServer->CLIENT1, outgoing> (8=FIX.4.4 9=60 35=0 34=42 49=FixServer 52=20140731-02:00:15.918 56=CLIENT1 10=145 )
<20140731-02:00:18, FIX.4.4:FixServer->CLIENT1, incoming> (8=FIX.4.4 9=60 35=0 34=54 49=CLIENT1 52=20140731-02:00:18.604 56=FixServer 10=143 )
<20140731-02:00:46, FIX.4.4:FixServer->CLIENT1, outgoing> (8=FIX.4.4 9=60 35=0 34=43 49=FixServer 52=20140731-02:00:46.916 56=CLIENT1 10=148 )
<20140731-02:00:48, FIX.4.4:FixServer->CLIENT1, incoming> (8=FIX.4.4 9=60 35=5 34=55 49=CLIENT1 52=20140731-02:00:48.603 56=FixServer 10=151 )
<20140731-02:00:48, FIX.4.4:FixServer->CLIENT1, event> (Received logout request)
<20140731-02:00:48, FIX.4.4:FixServer->CLIENT1, outgoing> (8=FIX.4.4 9=60 35=5 34=44 49=FixServer 52=20140731-02:00:48.607 56=CLIENT1 10=153 )
<20140731-02:00:48, FIX.4.4:FixServer->CLIENT1, event> (Sent logout response)
分享到:
评论

相关推荐

    ### 文章标题: 【自然语言处理】基于ChatGPT的REFORMER框架:提升Text-to-SQL模型的数据合成与增强系统设计

    内容概要:本文介绍了REFORMER,一个由ChatGPT驱动的数据合成框架,旨在解决Text-to-SQL模型因训练数据不足而导致的泛化能力差的问题。REFORMER通过“检索-编辑”方法,利用ChatGPT生成新的(问题,SQL查询)对,无需额外训练。该框架还引入了问题-查询-问题循环一致性验证,确保生成数据的质量。此外,REFORMER探索了两种数据增强技术:带模式信息的直接改写和使用构造SQL查询描述的改写。实验结果表明,REFORMER在多个评估指标上均优于之前的增强方法。 适合人群:对自然语言处理和SQL查询生成感兴趣的科研人员、工程师,尤其是从事Text-to-SQL模型开发和优化的专业人士。 使用场景及目标:①生成更多样化和高质量的(问题,SQL查询)对以增强Text-to-SQL模型的训练数据;②通过ChatGPT生成新的SQL查询和问题改写,提升模型的泛化能力和适应新领域的能力;③验证生成数据的一致性和质量,确保其符合预期。 阅读建议:本文不仅展示了REFORMER的技术细节和实验结果,还讨论了其局限性和未来研究方向。读者应重点关注框架的设计思路、实验设置和结果分析,以理解ChatGPT在数据增强中的应用潜力。同时,建议结合实际应用场景,思考如何利用REFORMER提升现有Text-to-SQL系统的性能。

    20220319-1.pdf

    20220319-1.pdf

    电磁兼容仿真:电磁敏感性分析.zip

    电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。

    ### 软考高项项目管理领域核心知识点与备考策略:涵盖综合知识、案例分析与论文写作

    内容概要:本文详细介绍了软考高项(高级信息系统项目管理师)的备考策略、考试内容及应试技巧。首先,文章强调了二八法则的应用,即80%的时间精力应放在项目管理领域的核心知识点上,如五大过程组、十大知识域等,20%的时间放在IT知识和组织级项目管理上。备考分为三个阶段:基础阶段通过精读教材、绘制思维导图夯实基础;强化阶段通过真题训练、案例分析提升实战能力;冲刺阶段通过论文押题、模拟考试做好最后准备。文章还特别指出,计算题和论文写作是考试的重点和难点,需重点练习。此外,针对不同地区的考生,提供了差异化的备考建议,如一线城市侧重新技术应用,中西部地区关注乡村振兴信息化等。最后,文章提醒考生关注机考模拟系统的开放时间和准考证打印时间,确保顺利参加考试。 适合人群:准备参加软考高项考试的考生,特别是有一定项目管理基础并希望系统复习、提高应试能力的考生。 使用场景及目标:①帮助考生高效利用有限时间,集中精力复习核心知识点;②通过模拟练习和真题训练,提升计算题和论文写作的能力;③结合实际案例,掌握项目管理全流程知识,提高考试通过率。 其他说明:备考过程中,考生应结合自身实际情况,灵活调整学习计划。同时,充分利用各种学习资源,如精讲课视频、直播课、历年真题等,不断巩固和深化对知识点的理解。考试改革后,机考成为主流,考生需提前熟悉机考系统,确保考试时能够熟练操作。

    多功能医用护理床(sw20可编辑+cad+说明书)_三维3D设计图纸.zip

    多功能医用护理床(sw20可编辑+cad+说明书)_三维3D设计图纸.zip

    西门子S7-200 Smart与台达DT330温控器基于Modbus RTU的485通讯实现及调试技巧

    内容概要:本文详细介绍了西门子S7-200 Smart PLC与台达DT330温控器通过RS485接口进行Modbus RTU通讯的方法。首先,文中阐述了双方设备的通讯参数设置,确保波特率、校验位等参数的一致性。接着,展示了PLC端的轮询控制逻辑,采用定时器和状态机来管理读写操作,避免数据冲突。对于具体的读写操作,提供了详细的寄存器地址映射规则以及数据类型的转换方法,解决了台达温控器特有的寄存器地址偏移问题。此外,还分享了一些实用的调试技巧,如使用串口助手抓包验证通讯效果,以及针对常见错误码的解决方案。最后,在触摸屏方面,利用昆仑通态MCGS组态软件实现了温度数据显示和设定的功能。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些需要进行PLC与温控器通讯集成工作的人员。 使用场景及目标:适用于需要将西门子S7-200 Smart PLC与台达DT330温控器进行通讯连接并实现温度监控的应用场合。主要目的是掌握正确的通讯配置步骤,理解Modbus RTU协议的具体应用,提高系统的可靠性和稳定性。 其他说明:文中提到的所有代码均已经过实际测试,并附带详细的注释,便于读者理解和学习。同时强调了硬件连接的重要性,给出了接线建议,帮助初学者少走弯路。

    基于Simulink的四永磁同步电机偏差耦合同步控制仿真建模与优化

    内容概要:本文详细介绍了利用Simulink构建四台永磁同步电机(PMSM)偏差耦合同步控制系统的方法及其优化策略。首先阐述了多电机同步控制在工业自动化中的重要性和应用场景,如AGV小车底盘驱动、传送带协同等。接着深入探讨了偏差耦合控制的具体实现方式,包括环形耦合结构的设计、耦合补偿算法以及PID参数调整方法。文中特别强调了耦合系数的选择对于系统稳定性的影响,并提供了具体的MATLAB函数用于计算各电机之间的耦合补偿量。此外,还讨论了如何通过动态权重分配算法来增强相邻电机间的耦合关系,从而提高同步速度。同时,针对可能出现的问题提出了预防措施,如避免使用微分环节、设置合理的摩擦系数和采样周期等。最后分享了一些实践经验,例如采用在线参数辨识技术和低通滤波器以应对负载突变等情况。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是那些对多电机同步控制感兴趣的读者。 使用场景及目标:适用于需要精确控制多个电机同步运行的场合,如生产线上多轴协调动作、机器人关节控制等。主要目的是确保各个电机能够按照预定的速度平稳地协同工作,减少由于不同步造成的故障风险。 其他说明:文章不仅提供了理论指导,还包括了许多实用的操作技巧和注意事项,有助于读者更好地理解和掌握这一复杂的控制技术。

    2011春土木工程施工习题集(1).pdf

    2011春土木工程施工习题集(1).pdf

    信捷XD5 PLC与欧姆龙E5CC温控器基于Modbus RTU的双设定温度控制系统实现

    内容概要:本文详细介绍了信捷XD5 PLC与欧姆龙E5CC温控器之间的通讯实现及其双设定温度控制功能。首先,文中阐述了硬件连接的具体步骤,包括PLC、温控器和触摸屏的选择与连接方式。接着,详细解释了参数设置的关键点,确保两者能够正确通信。然后,展示了主程序的轮询机制以及温度读取、设定值写入和输出控制的具体代码实现。针对可能出现的问题,提供了详细的避坑指南和技术细节,如温度值转换、通讯超时处理等。最后,强调了系统的稳定性和可靠性,并给出了实际应用中的经验和建议。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC与温控器通讯感兴趣的读者。 使用场景及目标:适用于需要实现PLC与温控器之间高效、稳定的通讯控制的工业自动化项目。目标是帮助工程师快速掌握信捷XD5 PLC与欧姆龙E5CC温控器的通讯配置和双设定温度控制的实现方法。 其他说明:文中提供的代码和配置建议已经过实际项目的验证,具有较高的实用价值。对于初学者来说,可以作为入门级的学习资料;对于有一定经验的技术人员,则可以作为参考和优化现有系统的依据。

    (整理)2 全 四川大学 土木工程经济练习题 四川大学锦城学院 肖栋天 0303COLLEGE TWO XIA.doc

    (整理)2 全 四川大学 土木工程经济练习题 四川大学锦城学院 肖栋天 0303COLLEGE TWO XIA.doc

    电大自我鉴定土木工程.doc

    电大自我鉴定土木工程.doc

    粉料搅拌器sw18_三维3D设计图纸.zip

    粉料搅拌器sw18_三维3D设计图纸.zip

    00300118347_ad5d7425.pdf

    00300118347_ad5d7425.pdf

    【嵌入式开发】STM32F103C8T6最小系统板硬件组成与开发环境搭建指南:快速上手嵌入式项目开发

    内容概要:文章详细介绍了 STM32F103C8T6 最小系统板,包括其组成、硬件连接方式、开发环境搭建步骤以及一个简单的 LED 闪烁示例代码。STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的 32 位微控制器,具有高性能、低功耗和丰富的外设资源。最小系统板由主处理器、电源电路、时钟电路、复位与调试接口和 I/O 引脚组成。硬件连接方面,支持多种供电方式和调试接口。开发环境可以使用 STM32CubeIDE、Keil MDK-ARM 或 Arduino IDE 搭建。; 适合人群:对嵌入式开发有兴趣的学习者和初学者,尤其是希望了解 STM32 系列微控制器的开发者。; 使用场景及目标:① 学习 STM32F103C8T6 最小系统板的基本组成和硬件连接;② 搭建适合 STM32F103C8T6 的开发环境,如 STM32CubeIDE 或 Keil MDK-ARM;③ 实现简单的嵌入式项目,如 LED 闪烁示例。; 其他说明:此指南提供了详细的步骤和示例代码,帮助用户快速上手 STM32F103C8T6 最小系统板的开发。建议在实际操作中仔细阅读每一步骤,并参考提供的代码示例进行实践。

    公共安全视频图像信息系统管理条例.docx

    公共安全视频图像信息系统管理条例.docx

    回转工作台sw20_三维3D设计图纸_三维3D设计图纸.zip

    回转工作台sw20_三维3D设计图纸_三维3D设计图纸.zip

    清晰结构的三螺杆泵sw16可编辑_三维3D设计图纸_三维3D设计图纸.zip

    清晰结构的三螺杆泵sw16可编辑_三维3D设计图纸_三维3D设计图纸.zip

    汽轮机低压缸sw22可编辑_三维3D设计图纸_三维3D设计图纸.zip

    汽轮机低压缸sw22可编辑_三维3D设计图纸_三维3D设计图纸.zip

    电磁场仿真:磁热耦合仿真.zip

    电磁领域系列仿真模拟教程,每个包10几个教程,从基础到精通,案例多多。

Global site tag (gtag.js) - Google Analytics